когда я добавляю библиотечные зависимости в pom.xml, контейнер сервлетов Jetty не работает должным образом - PullRequest
0 голосов
/ 19 мая 2019

У меня есть простое веб-приложение на Java с пружиной. Затем я добавил

    <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>core</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>crypto</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>abi</artifactId>
        <version>4.2.0</version>
    </dependency>

в pom.xml

Теперь, когда я выполняю mvn jetty:run, я получаю (который печатает через пару минут)

[WARNING] Failed startup of context o.e.j.m.p.JettyWebAppContext@4784efd9{/crowdfunding,file:/C:/Users/d/eclipse-jee-workspace/crowdfunding/src/main/webapp/,STARTING}{file:/C:/Users/d/eclipse-jee-workspace/crowdfunding/src/main/webapp/}
java.lang.Exception: Timeout scanning annotations
    at org.eclipse.jetty.annotations.AnnotationConfiguration.scanForAnnotations (AnnotationConfiguration.java:577)
    at org.eclipse.jetty.annotations.AnnotationConfiguration.configure (AnnotationConfiguration.java:447)

и ошибка 503 в моем браузере

1 Ответ

1 голос
/ 19 мая 2019

Сканирование по умолчанию будет ожидать 60 секунд (1 минуту) для сканирования всех файлов WEB-INF/classes и WEB-INF/lib/*.jar.

Это можно настроить, чтобы быть длиннее. Но если это займет так много времени, то у вас может быть ...

  • Очень медленный компьютер (вы не сказали)
  • Очень большой набор WEB-INF/lib записей (вы нам об этом тоже не говорили)
  • Ошибка в одной из ваших WEB-INF/lib записей (плохой файл JAR, довольно часто встречающийся на самом деле)
  • Конфигурация классов вашего сервера, которая конфликтует с вашим WebApp (встречается чаще при использовании встроенного шлюза, чем при автономном jetty-home использовании)
  • Конфигурация вашего WebAppContext с пользовательским загрузчиком классов (это НЕ рекомендуется, если у вас это есть, то вы сами по себе, так как все ниже здесь предполагает нормальный WebAppClassloader)
  • Конфигурация вашего WebAppContext, которая инвертирует приоритет стандартного родительского загрузчика сервлета (если вы установили этот setParentLoaderPriority(), затем закомментируйте этот вызов и повторите попытку)

Предположим, у вас либо плохие файлы JAR, либо есть конфликтующие зависимости.

Что означают эти 3 зависимости?

$ mvn dependency:tree
...(snip)...
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ huge-war ---
[INFO] org.eclipse.jetty.demo:huge-war:war:1.0-SNAPSHOT
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] +- org.web3j:core:jar:4.2.0:compile
[INFO] |  +- org.web3j:tuples:jar:4.2.0:compile
[INFO] |  +- com.github.jnr:jnr-unixsocket:jar:0.21:compile
[INFO] |  |  +- com.github.jnr:jnr-ffi:jar:2.1.9:compile
[INFO] |  |  |  +- com.github.jnr:jffi:jar:1.2.17:compile
[INFO] |  |  |  +- com.github.jnr:jffi:jar:native:1.2.16:runtime
[INFO] |  |  |  +- org.ow2.asm:asm:jar:5.0.3:compile
[INFO] |  |  |  +- org.ow2.asm:asm-commons:jar:5.0.3:compile
[INFO] |  |  |  +- org.ow2.asm:asm-analysis:jar:5.0.3:compile
[INFO] |  |  |  +- org.ow2.asm:asm-tree:jar:5.0.3:compile
[INFO] |  |  |  +- org.ow2.asm:asm-util:jar:5.0.3:compile
[INFO] |  |  |  +- com.github.jnr:jnr-a64asm:jar:1.0.0:compile
[INFO] |  |  |  \- com.github.jnr:jnr-x86asm:jar:1.0.2:compile
[INFO] |  |  +- com.github.jnr:jnr-constants:jar:0.9.11:compile
[INFO] |  |  +- com.github.jnr:jnr-enxio:jar:0.19:compile
[INFO] |  |  \- com.github.jnr:jnr-posix:jar:3.0.47:compile
[INFO] |  +- com.squareup.okhttp3:okhttp:jar:3.8.1:compile
[INFO] |  |  \- com.squareup.okio:okio:jar:1.13.0:compile
[INFO] |  +- com.squareup.okhttp3:logging-interceptor:jar:3.8.1:compile
[INFO] |  +- io.reactivex.rxjava2:rxjava:jar:2.2.2:compile
[INFO] |  |  \- org.reactivestreams:reactive-streams:jar:1.0.2:compile
[INFO] |  +- org.java-websocket:Java-WebSocket:jar:1.3.8:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.5:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.8.5:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] +- org.web3j:crypto:jar:4.2.0:compile
[INFO] |  +- org.web3j:rlp:jar:4.2.0:compile
[INFO] |  \- org.web3j:utils:jar:4.2.0:compile
[INFO] |     \- org.bouncycastle:bcprov-jdk15on:jar:1.60:compile
[INFO] \- org.web3j:abi:jar:4.2.0:compile

Классы unixsocket будут проблематичными изнутри WebApp, поскольку изоляция загрузчика классов и различные средства защиты, которые обеспечивает контейнер Servlet, означают, что эти собственные классы / библиотеки не будут работать при выполнении из заблокированной среды ServletContext.

Но это не помешает запуску веб-приложения, а только предотвратит поведение IPC / UnixSocket во время выполнения.

Я также вижу org.ow2.asm:asm:jar:5.0.3:compile, который находится на старой стороне.

Причал поставляется с АСМ 7.0

$ ls -la ~/code/jetty/distros/jetty-home-9.4.18.v20190429/lib/annotations/
total 316
drwxr-xr-x  2 joakim joakim   4096 May  1 13:09 ./
drwxr-xr-x 14 joakim joakim   4096 May  1 13:09 ../
-rw-r--r--  1 joakim joakim 113676 Nov  2  2018 asm-7.0.jar
-rw-r--r--  1 joakim joakim  33317 Nov  2  2018 asm-analysis-7.0.jar
-rw-r--r--  1 joakim joakim  79850 Nov  2  2018 asm-commons-7.0.jar
-rw-r--r--  1 joakim joakim  50399 Nov  2  2018 asm-tree-7.0.jar
-rw-r--r--  1 joakim joakim  26430 Jan 31 15:09 javax.annotation-api-1.3.jar

В зависимости от того, как вы запускаете Jetty, это может быть источником проблем инициализации и сканирования аннотаций / байт-кода. Asm 5.0 и asm 7.0 не полностью совместимы в двоичном формате (по крайней мере, с точки зрения потребностей / использования Jetty)

В общем, нет ничего на в разрешенном / эффективном списке зависимостей, о котором просят 3 <dependency> записи.

Итак, давайте посмотрим, что произойдет, если вы попытаетесь развернуть веб-приложение только с этими 3 зависимостями, вместе со сканированием аннотаций ...

$ cat start.ini
--module=http
jetty.http.port=8080
--module=deploy
--module=annotations

$ ls -la webapps/
total 10500
drwxr-xr-x 2 joakim joakim     4096 May 19 10:59 ./
drwxr-xr-x 6 joakim joakim     4096 May 19 10:58 ../
-rw-r--r-- 1 joakim joakim 10742370 May 19 10:58 demo-with-w3j-libs.war

$ java -jar ~/code/jetty/distros/jetty-home-9.4.18.v20190429/start.jar 
java -jar ~/code/jetty/distros/jetty-home-9.4.18.v20190429/start.jar
2019-05-19 11:11:02.993:INFO::main: Logging initialized @397ms to org.eclipse.jetty.util.log.StdErrLog
2019-05-19 11:11:03.182:INFO:oejs.Server:main: jetty-9.4.18.v20190429; built: 2019-04-29T20:42:08.989Z; git: e1bc35120a6617ee3df052294e433f3a25ce7097; jvm 11.0.3+7
2019-05-19 11:11:03.195:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/joakim/code/jetty/stackoverflow/huge-war/webapps/] at interval 1
2019-05-19 11:11:03.896:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=436ms
2019-05-19 11:11:03.902:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /demo-with-w3j-libs, did not find org.eclipse.jetty.jsp.JettyJspServlet
2019-05-19 11:11:03.911:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2019-05-19 11:11:03.911:INFO:oejs.session:main: No SessionScavenger set, using defaults
2019-05-19 11:11:03.912:INFO:oejs.session:main: node0 Scavenging every 660000ms
2019-05-19 11:11:03.929:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@75437611{Demo of a WebApp with a large WEB-INF/lib,/demo-with-w3j-libs,file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-5411225940231111244.dir/webapp/,AVAILABLE}{/demo-with-w3j-libs.war}
2019-05-19 11:11:04.236:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=184ms
2019-05-19 11:11:04.237:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /huge-war, did not find org.eclipse.jetty.jsp.JettyJspServlet
2019-05-19 11:11:04.240:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@6f7923a5{Demo of a WebApp with a large WEB-INF/lib,/huge-war,file:///tmp/jetty-0.0.0.0-8080-huge-war.war-_huge-war-any-2121417525584312936.dir/webapp/,AVAILABLE}{/huge-war.war}
2019-05-19 11:11:04.295:INFO:oejs.AbstractConnector:main: Started ServerConnector@52c3cb31{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2019-05-19 11:11:04.295:INFO:oejs.Server:main: Started @1700ms

Ага, как я и ожидал, все будет хорошо. Фактически для сканирования этой WAR (на моей машине) потребовалось менее 184 мс ..

2019-05-19 11:11:04.236:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=184ms

Возможно, ваша инициализация может показать вам, что происходит.

Запустите с DEBUG, включенным для org.eclipse.jetty.annotations и org.eclipse.jetty.webapp, и посмотрите, представлены ли какие-либо исключения. Также обратите внимание на время, сообщаемое при сканировании аннотации, оно может указывать либо на конкретный проблемный файл jar, либо на общую проблему синхронизации с полным набором имеющихся у вас библиотек.

Пример запуска jetty со специфическими свойствами StdErrLog для включения отладки в 2 пакетах org.eclipse.jetty.annotations и org.eclipse.jetty.webapp.

Вывод покажет вам проблемы с файлами JAR и временем для каждого сканированного файла JAR. Найдите «Сканирование истекшего времени», строки после слов сообщат вам время каждого файла JAR в вашем веб-приложении.

$ java -jar ~/code/jetty/distros/jetty-home-9.4.18.v20190429/start.jar -Dorg.eclipse.jetty.annotations.LEVEL=DEBUG -Dorg.eclipse.jetty.webapp.LEVEL=DEBUG
...(snip)...
2019-05-19 11:15:14.796:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/Darwin/libjffi-1.2.jnilib
2019-05-19 11:15:14.796:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/aarch64-Linux/libjffi-1.2.so
2019-05-19 11:15:14.796:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/arm-Linux/libjffi-1.2.so
2019-05-19 11:15:14.797:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/i386-Linux/libjffi-1.2.so
2019-05-19 11:15:14.797:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/i386-SunOS/libjffi-1.2.so
2019-05-19 11:15:14.797:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/i386-Windows/jffi-1.2.dll
2019-05-19 11:15:14.797:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/ppc-AIX/libjffi-1.2.a
2019-05-19 11:15:14.797:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/ppc64-Linux/libjffi-1.2.so
2019-05-19 11:15:14.800:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/ppc64le-Linux/libjffi-1.2.so
2019-05-19 11:15:14.800:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/sparcv9-Linux/libjffi-1.2.so
2019-05-19 11:15:14.800:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/sparcv9-SunOS/libjffi-1.2.so
2019-05-19 11:15:14.800:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/x86_64-FreeBSD/libjffi-1.2.so
2019-05-19 11:15:14.800:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/x86_64-Linux/libjffi-1.2.so
2019-05-19 11:15:14.801:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/x86_64-OpenBSD/libjffi-1.2.so
2019-05-19 11:15:14.801:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/x86_64-SunOS/libjffi-1.2.so
2019-05-19 11:15:14.801:DBUG:oeja.AnnotationParser:qtp1571967156-41: Not a class: jni/x86_64-Windows/jffi-1.2.dll
...(snip)...
2019-05-19 11:15:15.393:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=654ms
2019-05-19 11:15:15.393:DBUG:oeja.AnnotationConfiguration:main: Scanned file:///home/joakim/code/jetty/distros/jetty-home-9.4.18.v20190429/lib/servlet-api-3.1.jar in 141ms
2019-05-19 11:15:15.393:DBUG:oeja.AnnotationConfiguration:main: Scanned file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-14235900391383929769.dir/webapp/WEB-INF/classes/ in 1ms
2019-05-19 11:15:15.393:DBUG:oeja.AnnotationConfiguration:main: Scanned file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-14235900391383929769.dir/webapp/WEB-INF/lib/Java-WebSocket-1.3.8.jar in 144ms
2019-05-19 11:15:15.393:DBUG:oeja.AnnotationConfiguration:main: Scanned file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-14235900391383929769.dir/webapp/WEB-INF/lib/abi-4.2.0.jar in 163ms
2019-05-19 11:15:15.393:DBUG:oeja.AnnotationConfiguration:main: Scanned file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-14235900391383929769.dir/webapp/WEB-INF/lib/asm-5.0.3.jar in 126ms
...(snip)...
2019-05-19 11:15:15.394:DBUG:oeja.AnnotationConfiguration:main: Scanned 1 container path jars, 31 WEB-INF/lib jars, 1 WEB-INF/classes dirs in 654ms for context o.e.j.w.WebAppContext@75437611{demo-with-w3j-libs,/demo-with-w3j-libs,file:///tmp/jetty-0.0.0.0-8080-demo-with-w3j-libs.war-_demo-with-w3j-libs-any-14235900391383929769.dir/webapp/,STARTING}{/demo-with-w3j-libs.war}

Наконец, если у вас просто медленный компьютер, и вы просто хотите установить тайм-аут на большее значение, вы можете установить значение org.eclipse.jetty.annotations.maxWait (в секундах) на большее.

Это можно установить как атрибут ServletContext, или атрибут Server, или как свойство System (ищется в указанном порядке).

...