GlassFish/Payara - 定义的 Maven 依赖项抛出 ClassNotFoundException
GlassFish/Payara - Defined maven dependency throws ClassNotFoundException
我正在构建一个小型 Java 基于 EE 的 Web 应用程序,使用 Maven 作为构建工具。作为应用程序服务器,我使用 GlassFish 5/Payara 5。
当前版本编译没有问题,部署也没有问题。调用一些 REST 端点也可以正常工作。仅当我调用使用来自第三方库的资源的 REST 端点时 - 在本例中为 HtmlUnit - 我收到以下错误 StackTrace。
我与非基于 EE 的应用程序进行了直接比较,在该应用程序中此配置运行良好。
我检查了特定于 maven 的错误源,例如 provided/compile 范围标记问题,但我一无所获。在应用程序本身中,库 类 仅被调用或实例化,所以这应该不是问题。
我怀疑 Java EE 框架上下文中的错误源,但由于缺乏经验,我根本找不到它。
摘录pom.xml:
<dependencies>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.34.1</version>
</dependency>
...
</dependencies>
StackTrace 摘录:
[2019-04-19T19:00:11.284+0200] [glassfish 5.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=27 _ThreadName=http-listener-1(3)] [timeMillis: 1555693211284] [levelValue: 900] [[
StandardWrapperValve[com.webanalytics.toolbox.api.rest.scraperequest.RestRequestConfig]: Servlet.service() for servlet com.webanalytics.toolbox.api.rest.scraperequest.RestRequestConfig threw exception
java.lang.ClassNotFoundException: com.gargoylesoftware.htmlunit.html.HtmlPage
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1621)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1471)
我设法解决了这个问题。这是因为在 Maven 构建过程中,库被简单地打包到 ear 目录的顶层而不是 lib 目录。在父 pom.xml 中添加 -tag 是解决方案。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<version>8</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules>
<webModule>
<groupId>com.webanalytics-toolbox</groupId>
<artifactId>scraper-web</artifactId>
<contextRoot>/</contextRoot>
</webModule>
</modules>
</configuration>
</plugin>
我正在构建一个小型 Java 基于 EE 的 Web 应用程序,使用 Maven 作为构建工具。作为应用程序服务器,我使用 GlassFish 5/Payara 5。
当前版本编译没有问题,部署也没有问题。调用一些 REST 端点也可以正常工作。仅当我调用使用来自第三方库的资源的 REST 端点时 - 在本例中为 HtmlUnit - 我收到以下错误 StackTrace。
我与非基于 EE 的应用程序进行了直接比较,在该应用程序中此配置运行良好。
我检查了特定于 maven 的错误源,例如 provided/compile 范围标记问题,但我一无所获。在应用程序本身中,库 类 仅被调用或实例化,所以这应该不是问题。
我怀疑 Java EE 框架上下文中的错误源,但由于缺乏经验,我根本找不到它。
摘录pom.xml:
<dependencies>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.34.1</version>
</dependency>
...
</dependencies>
StackTrace 摘录:
[2019-04-19T19:00:11.284+0200] [glassfish 5.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=27 _ThreadName=http-listener-1(3)] [timeMillis: 1555693211284] [levelValue: 900] [[
StandardWrapperValve[com.webanalytics.toolbox.api.rest.scraperequest.RestRequestConfig]: Servlet.service() for servlet com.webanalytics.toolbox.api.rest.scraperequest.RestRequestConfig threw exception
java.lang.ClassNotFoundException: com.gargoylesoftware.htmlunit.html.HtmlPage
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1621)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1471)
我设法解决了这个问题。这是因为在 Maven 构建过程中,库被简单地打包到 ear 目录的顶层而不是 lib 目录。在父 pom.xml 中添加 -tag 是解决方案。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<version>8</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules>
<webModule>
<groupId>com.webanalytics-toolbox</groupId>
<artifactId>scraper-web</artifactId>
<contextRoot>/</contextRoot>
</webModule>
</modules>
</configuration>
</plugin>