当我尝试在 Eclipse 上运行 Java 应用程序时,两个依赖项之间的冲突导致应用程序失败。
我正在尝试将我的项目 Java 版本从 OracleJDK 8 升级到 OpenJDK 11。因此,我还必须将 GWT 依赖项从 2.6.0 更新到 2.8.2,以及从 MOJO gwt-maven- 切换tboyer 版本的插件也是如此。此外,构建是在 Eclipse IDE 4.9.0 上的 Maven 4.0.0 上完成的。
pom.xml 的片段
<properties>
<gwt.version>2.8.2</gwt.version>
...
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt</artifactId>
<version>${gwt.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-dev</artifactId>
<scope>provided</scope>
</dependency>
...
<build>
<plugins>
<plugin>
<groupId>net.ltgt.gwt.maven</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>1.0-rc-10</version>
<executions>
<execution>
<id>compile-common</id>
<goals>
<goal>compile</goal>
<goal>test</goal>
</goals>
<configuration>
<moduleName>XXXXModule</moduleName>
</configuration>
</execution>
<execution>
<id>XXXX</id>
<goals>
<goal>compile</goal>
<goal>test</goal>
</goals>
<configuration>
<moduleName>XXXXModule</moduleName>
</configuration>
</execution>
<execution>
<id>XXXX</id>
<goals>
<goal>compile</goal>
<goal>test</goal>
</goals>
<configuration>
<moduleName>XXXXModule</moduleName>
</configuration>
</execution>
<execution>
<id>XXXX</id>
<goals>
<goal>compile</goal>
<goal>test</goal>
</goals>
<configuration>
<moduleName>XXXXModule</moduleName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
因此,当我在 Eclipse 上运行应用程序时,会出现以下错误:
SEVERE: Application encountered an exception during Start.
XXXX.ApplicationException: Failed to reflect on start method.
at XXXX.ApplicationLauncher.startApplication(ApplicationLauncher.java:471)
at XXXX.ApplicationLauncher.doRun(ApplicationLauncher.java:185)
at XXXX.ApplicationLauncher.main(ApplicationLauncher.java:67)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at XXXX.ApplicationLauncher.startApplication(ApplicationLauncher.java:469)
... 2 more
Caused by: java.lang.NoSuchMethodError: org.apache.tomcat.util.ExceptionUtils.preload()V
at org.apache.catalina.startup.Tomcat.<init>(Tomcat.java:181)
....
经过调查,我发现我的两个依赖项 tomcat-embed-core-7.0.91 和 apache-jsp-8.0.9.M3 都包含有几个不同的 ExceptionUtils,因此是 Exception。此外,gwt-dev 依赖项正在提取 apache-jsp,该依赖项仅在 Maven 构建期间需要运行 gwt-maven-plugin。
gwt-dev:2.8.2
apache-jsp:9.2.14.v20151106
apache-jsp:8.0.9.M3
但是由于某种原因,Eclipse 将 gwt-dev 及其依赖项包含在运行时路径中,即使我在 pom.xml 中有“提供”范围标记。
我已经尝试排除 apache-jsp 依赖项,但出现编译问题,因为显然 gwt-dev 仍在添加,这取决于 apache-jsp。
概括
- Tbroyer GWT-Maven-Plugin 要求 pom 文件包含 gwt-dev 作为依赖项,以便在构建期间正确运行。
- 但是,在 Eclipse 上运行应用程序时,在 org.apache.tomcat.util.ExceptionUtils.preload()V 上发生 NoSuchMethodException
- 问题是有两个 ExceptionUtil 类具有来自不同 jar 和方法的相同包。
- 其中一个罐子是 apache-jsp,它是 gwt-dev 的依赖项。Gwt-dev 及其依赖项不应成为运行时类路径的一部分。
问题:有没有办法确保 gwt-dev 仅在 Maven 构建期间使用,而不是 Eclipse Java 应用程序运行时类路径的一部分?