xref: /unit/auto/modules/java (revision 977:4f9268f27b57)
1
2# Copyright (C) NGINX, Inc.
3
4
5shift
6
7NXT_JAVA_HOME=${JAVA_HOME-}
8NXT_JAR_REPO=http://central.maven.org/maven2/
9NXT_JAR_LOCAL_REPO=$HOME/.m2/repository/
10
11for nxt_option; do
12
13    case "$nxt_option" in
14        -*=*) value=`echo "$nxt_option" | sed -e 's/[-_a-zA-Z0-9]*=//'`     ;;
15           *) value="" ;;
16    esac
17
18    case "$nxt_option" in
19
20        --module=*)     NXT_JAVA_MODULE="$value"                              ;;
21        --home=*)       NXT_JAVA_HOME="$value"                                ;;
22        --lib-path=*)   NXT_JAVA_LIB_PATH="$value"                            ;;
23        --repo=*)       NXT_JAR_REPO="$value"                                 ;;
24        --local-repo=*) NXT_JAR_LOCAL_REPO="$value"                           ;;
25        --jars=*)       NXT_JARS="$value"                                     ;;
26
27        --help)
28            cat << END
29
30    --module=NAME         set unit Java module name
31    --home=DIR            set Java home directory
32    --lib-path=DIRECTORY  set directory path to libjvm.so library
33    --repo=URL            set Maven remote repository URL
34                          default: "$NXT_JAR_REPO"
35    --local-repo=DIR      set local repository directory
36                          default: "$NXT_JAR_LOCAL_REPO"
37    --jars=DIR            set jars install/search directory
38
39END
40            exit 0
41        ;;
42
43        *)
44            echo
45            echo $0: error: invalid Java option \"$nxt_option\"
46            echo
47            exit 1
48        ;;
49    esac
50
51done
52
53
54if [ ! -f $NXT_AUTOCONF_DATA ]; then
55   echo
56   echo Please run common $0 before configuring module \"$nxt_module\".
57   echo
58   exit 1
59fi
60
61. $NXT_AUTOCONF_DATA
62
63
64NXT_JARS=${NXT_JARS=$NXT_MODULES}
65NXT_JAVA_MODULE=${NXT_JAVA_MODULE=java}
66NXT_JAVA_LIB_PATH=${NXT_JAVA_LIB_PATH=}
67
68$echo "configuring Java module"
69$echo "configuring Java module ..." >> $NXT_AUTOCONF_ERR
70
71if [ -n "${NXT_JAVA_HOME}" ]; then
72    $echo "using java.home ${NXT_JAVA_HOME}"
73    $echo "using java.home ${NXT_JAVA_HOME}" >> $NXT_AUTOCONF_ERR
74
75    if [ ! -d "${NXT_JAVA_HOME}" ]; then
76        $echo
77        $echo $0: error: Java home directory not found.
78        $echo
79        exit 1
80    fi
81
82    NXT_JAVA="${NXT_JAVA_HOME}/bin/java"
83
84else
85    $echo -n "checking for java executable"
86    $echo "checking for java executable ..." >> $NXT_AUTOCONF_ERR
87
88    NXT_JAVA=`which java || :`
89    if [ -z "$NXT_JAVA" -o ! -x "$NXT_JAVA" ]; then
90        $echo
91        $echo $0: error: java executable not found.
92        $echo
93        exit 1
94    fi
95
96    $echo " found $NXT_JAVA"
97    $echo "found $NXT_JAVA" >> $NXT_AUTOCONF_ERR
98
99    "$NXT_JAVA" -version
100
101    $echo -n "checking java.home"
102    $echo "checking java.home ..." >> $NXT_AUTOCONF_ERR
103
104    NXT_JAVA_HOME=`$NXT_JAVA -XshowSettings 2>&1 | grep -F -e java.home | sed -e 's/^.*= //'`
105    if [ -z "$NXT_JAVA_HOME" ]; then
106        $echo
107        $echo $0: error: java.home not found.
108        $echo
109        exit 1
110    fi
111
112    $echo " $NXT_JAVA_HOME"
113    $echo "got java.home $NXT_JAVA_HOME" >> $NXT_AUTOCONF_ERR
114
115    if [ ! -x "${NXT_JAVA_HOME}/bin/javac" ]; then
116        NXT_JAVA_HOME_=${NXT_JAVA_HOME%/jre}
117        if [ -x "${NXT_JAVA_HOME_}/bin/javac" ]; then
118            $echo "adjust java.home $NXT_JAVA_HOME_"
119            $echo "adjust java.home $NXT_JAVA_HOME_" >> $NXT_AUTOCONF_ERR
120
121            NXT_JAVA_HOME="$NXT_JAVA_HOME_"
122        fi
123    fi
124fi
125
126NXT_JAVAC="${NXT_JAVA_HOME}/bin/javac"
127
128if [ ! -x "$NXT_JAVAC" ]; then
129    $echo
130    $echo $0: error: javac not found.
131    $echo
132    exit 1
133fi
134
135NXT_JAVA_INCLUDE="-I${NXT_JAVA_HOME}/include"
136
137case "$NXT_SYSTEM" in
138    Linux)
139        NXT_JAVA_INCLUDE="${NXT_JAVA_INCLUDE} -I${NXT_JAVA_HOME}/include/linux"
140        ;;
141    Darwin)
142        NXT_JAVA_INCLUDE="${NXT_JAVA_INCLUDE} -I${NXT_JAVA_HOME}/include/darwin"
143        ;;
144    FreeBSD)
145        NXT_JAVA_INCLUDE="${NXT_JAVA_INCLUDE} -I${NXT_JAVA_HOME}/include/freebsd"
146        ;;
147esac
148
149if [ -z "$NXT_JAVA_LIB_PATH" ]; then
150    $echo -n "checking library path"
151    $echo "checking library path ..." >> $NXT_AUTOCONF_ERR
152
153    if [ ! -x "$NXT_JAVA" ]; then
154        $echo
155        $echo $0: error: java executable not found.
156        $echo
157        exit 1
158    fi
159
160    NXT_JAVA_LIB_PATH=`$NXT_JAVA -XshowSettings 2>&1 | grep -F -e sun.boot.library.path | sed -e 's/^.*= //'`
161
162    if [ -z "$NXT_JAVA_LIB_PATH" ]; then
163        $echo
164        $echo $0: error: library path not found.
165        $echo
166        exit 1
167    fi
168
169    NXT_JAVA_LIB_PATH="${NXT_JAVA_LIB_PATH}/server"
170
171    $echo " $NXT_JAVA_LIB_PATH"
172    $echo "got library path $NXT_JAVA_LIB_PATH" >> $NXT_AUTOCONF_ERR
173fi
174
175NXT_JAVA_LDFLAGS="-L${NXT_JAVA_LIB_PATH} -Wl,-rpath ${NXT_JAVA_LIB_PATH} -ljvm"
176
177
178nxt_found=no
179
180nxt_feature="JNI"
181nxt_feature_name=""
182nxt_feature_run=no
183nxt_feature_incs="${NXT_JAVA_INCLUDE}"
184nxt_feature_libs="${NXT_JAVA_LDFLAGS}"
185nxt_feature_test="
186    #include <jni.h>
187
188    int main() {
189        JNI_CreateJavaVM(NULL, NULL, NULL);
190        return 0;
191    }"
192
193. auto/feature
194
195
196if [ $nxt_found = no ]; then
197    $echo
198    $echo $0: error: no JNI found.
199    $echo
200    exit 1;
201fi
202
203NXT_JAVA_VERSION=`$NXT_JAVAC -version 2>&1`
204NXT_JAVA_VERSION=${NXT_JAVA_VERSION#javac }
205NXT_JAVA_INCLUDE="$NXT_JAVA_INCLUDE -I$NXT_BUILD_DIR/$NXT_JAVA_MODULE -DNXT_JAVA_VERSION=$NXT_JAVA_VERSION"
206
207if grep ^$NXT_JAVA_MODULE: $NXT_MAKEFILE 2>&1 > /dev/null; then
208    $echo
209    $echo $0: error: duplicate \"$NXT_JAVA_MODULE\" module configured.
210    $echo
211    exit 1;
212fi
213
214. ./version
215
216NXT_UNIT_JAR=nginx-unit-jsc-${NXT_JAVA_MODULE}-$NXT_VERSION.jar
217
218NXT_JAVA_BUILD_CP=$NXT_BUILD_DIR/$NXT_JAVA_MODULE
219NXT_JAVA_INSTALL_JARS=
220NXT_JAVA_UNINSTALL_JARS=
221
222NXT_JAVA_JARS=$NXT_BUILD_DIR/$NXT_JAVA_MODULE/nxt_jars.h
223mkdir -p $NXT_BUILD_DIR/$NXT_JAVA_MODULE
224
225cat << END > $NXT_JAVA_JARS
226#ifndef _NXT_JAVA_JARS_INCLUDED_
227#define _NXT_JAVA_JARS_INCLUDED_
228
229#define NXT_JARS "$NXT_JARS"
230
231static const char *nxt_java_system_jars[] = {
232END
233
234NXT_TOMCAT_VERSION=9.0.13
235
236NXT_JAR_VERSION=$NXT_TOMCAT_VERSION
237
238NXT_JAR_NAME=tomcat-servlet-api
239NXT_JAR_NAMESPACE=org/apache/tomcat/
240. auto/modules/java_get_jar
241
242NXT_JAR_NAME=tomcat-el-api
243. auto/modules/java_get_jar
244
245NXT_JAR_NAME=tomcat-jsp-api
246. auto/modules/java_get_jar
247
248NXT_JAR_NAME=tomcat-jasper
249. auto/modules/java_get_jar
250
251NXT_JAR_NAME=tomcat-jasper-el
252. auto/modules/java_get_jar
253
254NXT_JAR_NAME=tomcat-juli
255. auto/modules/java_get_jar
256
257NXT_JAR_NAME=tomcat-api
258. auto/modules/java_get_jar
259
260NXT_JAR_NAME=tomcat-util-scan
261. auto/modules/java_get_jar
262
263NXT_JAR_NAME=tomcat-util
264. auto/modules/java_get_jar
265
266NXT_JAR_NAME=ecj
267NXT_JAR_VERSION=3.13.102
268NXT_JAR_NAMESPACE=org/eclipse/jdt/
269. auto/modules/java_get_jar
270
271cat << END >> $NXT_JAVA_JARS
272    NULL
273};
274
275static const char *nxt_java_unit_jars[] = {
276    "$NXT_UNIT_JAR",
277END
278
279NXT_JAR_VERSION=9.4.12.v20180830
280NXT_JAR_NAMESPACE=org/eclipse/jetty/
281
282NXT_JAR_NAME=jetty-util
283. auto/modules/java_get_jar
284
285NXT_JAR_NAME=jetty-server
286. auto/modules/java_get_jar
287
288NXT_JAR_NAME=jetty-http
289. auto/modules/java_get_jar
290
291NXT_JAR_NAME=classgraph
292NXT_JAR_VERSION=4.4.11
293NXT_JAR_NAMESPACE=io/github/classgraph/
294. auto/modules/java_get_jar
295
296cat << END >> $NXT_JAVA_JARS
297    NULL
298};
299
300#endif /* _NXT_JAVA_JARS_INCLUDED_ */
301END
302
303$echo " + Java module: ${NXT_JAVA_MODULE}.unit.so"
304
305. auto/cc/deps
306
307$echo >> $NXT_MAKEFILE
308
309NXT_JAVA_MODULE_SRCS=" \
310    src/nxt_java.c \
311    src/java/nxt_jni.c \
312    src/java/nxt_jni_Context.c \
313    src/java/nxt_jni_HeaderNamesEnumeration.c \
314    src/java/nxt_jni_HeadersEnumeration.c \
315    src/java/nxt_jni_InputStream.c \
316    src/java/nxt_jni_OutputStream.c \
317    src/java/nxt_jni_Request.c \
318    src/java/nxt_jni_Response.c \
319    src/java/nxt_jni_Thread.c \
320    src/java/nxt_jni_URLClassLoader.c \
321"
322
323# The Java module object files.
324
325nxt_objs=$NXT_BUILD_DIR/src/nxt_unit.o
326
327for nxt_src in $NXT_JAVA_MODULE_SRCS; do
328
329    nxt_obj=${nxt_src%.c}-$NXT_JAVA_MODULE.o
330    nxt_dep=${nxt_src%.c}-$NXT_JAVA_MODULE.dep
331    nxt_dep_flags=`nxt_gen_dep_flags`
332    nxt_dep_post=`nxt_gen_dep_post`
333    nxt_objs="$nxt_objs $NXT_BUILD_DIR/$nxt_obj"
334
335    cat << END >> $NXT_MAKEFILE
336
337$NXT_BUILD_DIR/$nxt_obj: $nxt_src
338	mkdir -p $NXT_BUILD_DIR/src/java
339	\$(CC) -c \$(CFLAGS) \$(NXT_INCS) $NXT_JAVA_INCLUDE \\
340	$nxt_dep_flags \\
341	-o $NXT_BUILD_DIR/$nxt_obj $nxt_src
342	$nxt_dep_post
343
344-include $NXT_BUILD_DIR/$nxt_dep
345
346END
347
348done
349
350NXT_JAVA_SRCS=" \
351    src/java/nginx/unit/Context.java \
352    src/java/nginx/unit/DynamicDispatcherRequest.java \
353    src/java/nginx/unit/DynamicPathRequest.java \
354    src/java/nginx/unit/ForwardRequestWrapper.java \
355    src/java/nginx/unit/HeaderNamesEnumeration.java \
356    src/java/nginx/unit/HeadersEnumeration.java \
357    src/java/nginx/unit/IncludeRequestWrapper.java \
358    src/java/nginx/unit/IncludeResponseWrapper.java \
359    src/java/nginx/unit/InitParams.java \
360    src/java/nginx/unit/InputStream.java \
361    src/java/nginx/unit/JspPropertyGroup.java \
362    src/java/nginx/unit/OutputStream.java \
363    src/java/nginx/unit/Request.java \
364    src/java/nginx/unit/RequestAttrProxy.java \
365    src/java/nginx/unit/Response.java \
366    src/java/nginx/unit/Session.java \
367    src/java/nginx/unit/SessionAttrProxy.java \
368    src/java/nginx/unit/Taglib.java \
369    src/java/nginx/unit/UnitSessionCookieConfig.java \
370"
371
372cat << END >> $NXT_MAKEFILE
373
374.PHONY: ${NXT_JAVA_MODULE}
375.PHONY: ${NXT_JAVA_MODULE}-install
376.PHONY: ${NXT_JAVA_MODULE}-uninstall
377
378all: ${NXT_JAVA_MODULE}
379
380${NXT_JAVA_MODULE}: $NXT_BUILD_DIR/${NXT_JAVA_MODULE}.unit.so \
381    $NXT_BUILD_DIR/$NXT_UNIT_JAR
382
383$NXT_BUILD_DIR/${NXT_JAVA_MODULE}.unit.so: $nxt_objs
384	\$(NXT_MODULE_LINK) -o $NXT_BUILD_DIR/${NXT_JAVA_MODULE}.unit.so \\
385	$nxt_objs $NXT_JAVA_LDFLAGS $NXT_LD_OPT
386
387
388install: ${NXT_JAVA_MODULE}-install
389
390${NXT_JAVA_MODULE}-install: $NXT_BUILD_DIR/${NXT_JAVA_MODULE}.unit.so \\
391    $NXT_BUILD_DIR/$NXT_UNIT_JAR java-shared-install
392	install -d \$(DESTDIR)$NXT_MODULES
393	install -p $NXT_BUILD_DIR/${NXT_JAVA_MODULE}.unit.so \\
394		\$(DESTDIR)$NXT_MODULES/
395	install -d \$(DESTDIR)$NXT_JARS
396	install -p -m 0644 $NXT_BUILD_DIR/$NXT_UNIT_JAR \$(DESTDIR)$NXT_JARS/
397
398
399uninstall: ${NXT_JAVA_MODULE}-uninstall
400
401${NXT_JAVA_MODULE}-uninstall: java-shared-uninstall
402	rm -f \$(DESTDIR)$NXT_MODULES/${NXT_JAVA_MODULE}.unit.so
403	@rmdir -p \$(DESTDIR)$NXT_MODULES 2>/dev/null || true
404	rm -f \$(DESTDIR)$NXT_JARS/$NXT_UNIT_JAR
405	@rmdir -p \$(DESTDIR)$NXT_JARS 2>/dev/null || true
406
407END
408
409if ! grep ^$NXT_BUILD_DIR/$NXT_UNIT_JAR: $NXT_MAKEFILE 2>&1 > /dev/null; then
410
411    cat << END >> $NXT_MAKEFILE
412
413.INTERMEDIATE: $NXT_BUILD_DIR/$NXT_JAVA_MODULE/.classes
414
415NXT_JAVA_SRCS = $NXT_JAVA_SRCS
416
417$NXT_BUILD_DIR/$NXT_JAVA_MODULE/.classes: \$(NXT_JAVA_SRCS)
418	rm -rf $NXT_BUILD_DIR/$NXT_JAVA_MODULE/nginx
419	$NXT_JAVAC -d $NXT_BUILD_DIR/$NXT_JAVA_MODULE -cp $NXT_JAVA_BUILD_CP \\
420		\$(NXT_JAVA_SRCS)
421
422$NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF/LICENSE: LICENSE
423	mkdir -p $NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF
424	cp -p LICENSE \$@
425
426$NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF/NOTICE: NOTICE
427	mkdir -p $NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF
428	cp -p NOTICE \$@
429
430
431$NXT_BUILD_DIR/$NXT_UNIT_JAR: $NXT_BUILD_DIR/$NXT_JAVA_MODULE/.classes \\
432    $NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF/LICENSE \\
433    $NXT_BUILD_DIR/$NXT_JAVA_MODULE/META-INF/NOTICE
434	$NXT_JAVA_HOME/bin/jar c -C $NXT_BUILD_DIR/$NXT_JAVA_MODULE META-INF \\
435		-C $NXT_BUILD_DIR/$NXT_JAVA_MODULE nginx/unit > \$@
436
437END
438
439fi
440
441if ! grep ^java-shared-install: $NXT_MAKEFILE 2>&1 > /dev/null; then
442
443    cat << END >> $NXT_MAKEFILE
444
445.PHONY: java-shared-install
446.PHONY: java-shared-uninstall
447
448java-shared-install: $NXT_JAVA_INSTALL_JARS
449	install -d \$(DESTDIR)$NXT_JARS
450	install -p -m 0644 $NXT_JAVA_INSTALL_JARS \$(DESTDIR)$NXT_JARS/
451
452java-shared-uninstall:
453	rm -f $NXT_JAVA_UNINSTALL_JARS
454	@rmdir -p \$(DESTDIR)$NXT_JARS 2>/dev/null || true
455
456END
457
458fi
459