我有一个基于 Maven 的 Web 应用程序,其中包含多个"本地"Maven 依赖项(即依赖项本身就是在与主应用程序相同的 Eclipse 工作区中维护的项目(。
我最近重写了从 Java 到 Kotlin 的一个依赖项。以下是 Kotlin 项目pom.xml
的相关内容:
<properties>
<kotlin.version>1.3.50</kotlin.version>
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
<project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version><!--$NO-MVN-MAN-VER$ -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.9.9</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
当我尝试在 Eclipse 中的 Tomcat 中启动应用程序时,出现错误:
22:40:22 SEVERE: Context initialization failed
[...]
Caused by: java.lang.NoClassDefFoundError: ... (one of my classes from the new project)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1363)
我已经执行了许多故障排除步骤,并毫无疑问地确定问题是由依赖项目中的 Kotlin 引起的,即如果我将 Kotlin 项目恢复到原始 Java 项目,一切将恢复正常。
我可以使用最新版本的 Eclipse、Kotlin、Maven、Tomcat 和 m2e-wtp 来解决此问题?
临时解决方法
我可以通过转到项目菜单 -> Maven ->"禁用工作区分辨率">,然后手动转到每个依赖项项目并执行Maven ->install来让应用程序再次工作。
这是非常不令人满意的,因为禁用工作区分辨率时,许多开发人员生产力功能都会丢失。因此,我将暂时保持这个问题开放,并提供赏金,希望有一个更永久的修复。
你的依赖项看起来不错。我没有发现任何错误。
但这里有一些理论的漫无边际,你应该研究一下:
-
这可能是因为工作区中有多个项目。
可能是工作区中有多个项目会增加 问题出现的机会。
这可能是因为其他项目具有不同的性质。
这可能是因为项目落地的方式(排序顺序、加载顺序、 别的什么?
这可能是因为某处的某些逻辑是片状的。
可能是在构建项目时意外地留下日食 州。
这可能是因为某种增量逻辑认为没有 需要尝试更改无生成,因为启动 项目。
这可能是因为所使用的启动机制是错误的。