当我尝试在Eclipse上运行Java应用程序时,两个依赖项之间的冲突导致该应用程序失败。
我试图将我的项目Java版本从OracleJDK 8升级到OpenJDK11。结果,我还必须将GWT依赖项从2.6.0升级到2.8.2,以及从MOJO gwt切换-maven-plugin以及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。此外,apache-jsp被gwt-dev依赖项拉动,这仅在Maven构建中运行gwt-maven-plugin时才需要。
gwt-dev:2.8.2
apache-jsp:9.2.14.v20151106
apache-jsp:8.0.9.M3
但是由于某种原因,即使我在pom.xml中具有“提供的”作用域标签,Eclipse仍将gwt-dev包括在内,并将其作为运行时路径的一部分。
我尝试排除apache-jsp依赖项,但是出现编译问题,因为显然仍在添加gwt-dev,这取决于apache-jsp。
摘要
问题:是否有办法确保gwt-dev仅在Maven构建期间使用,而不是Eclipse Java Application运行时类路径的一部分?
答案 0 :(得分:1)
是的,您可以确保客户端和服务器端的隔离类路径。您需要应用多模块布局。这也是旧版MOJO gwt maven插件与新一代tbroyer gwt maven插件(新版本正确支持多模块)之间的主要区别。检查this archetype作为多模块布局的参考。另外,请使用Packaging:gwt-app自动配置gwt maven插件执行。
使其与日食运行动作(tomcat或gwt)一起工作要困难一些。在正确应用tbroyer gwt maven插件和多模块布局之前,您将能够在终端中使用mvn tomcat7:run
和mvn gwt:codeserver
。然后,在IDE中使用它的推荐策略是配置此maven目标并使用IDE的maven工具运行它。这使它在您所有的环境(终端,CI,eclipse,intellij等)中都可以完全相同地工作。