我有一个需要外部罐子的maven应用程序。我能够很好地构建我的应用程序。当我部署到Tomcat(通过IntelliJ)并运行我的应用程序时,我收到许多NoClassDefFound错误。为了解决这个问题,我不得不将缺少的jar从我的.m2文件夹复制到我的Tomcat lib目录。
当我在可部署的应用程序中检查爆炸的战争时,WEB-INF / lib目录没有丢失的jar。显然我的应用程序会抱怨。
我的问题是,如何让我的maven在可部署的war文件中包含运行时jar?问题是,我有其他人在同一个应用程序上工作,使用相同的POM,没有人需要将丢失的jar复制到Tomcat。
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
<scope>provided</scope>
</dependency>
答案 0 :(得分:1)
对于将来遇到此问题的任何人:
我有完全相同的问题 - pom中的jar在运行时是不可用的,Java Build Path中的jar也不是。我能找到的唯一解决方法是将jar添加到tomcat / lib目录。
原来我的Maven本地存储库已损坏 - 我不知道它有多少,但至少有一部分存在。我将.m2 / repository目录重命名为oldrepository,尝试了&#34; clean install&#34;再次(花了一段时间让所有的罐子再次下载),之后一切都很完美。
希望这有助于某人。
答案 1 :(得分:0)
检查是否有使用<scope>provided</scope>
声明的依赖项,或者可能是test
范围内的偶然事件。 Maven不会在warfile中打包这些依赖项。
如果它们不是经典依赖项,但真正的外部jar以另一种方式添加到类路径中,即从Mavens到达,您可能希望通过mvn install:install-file
将它们安装到本地存储库中让它们被Maven正确识别。
如果由于某种原因无法将jar安装到本地存储库,则另一个选项可能是system
范围,您可以在其中给出所述jar的确切位置,但这不会将jar打包到warfile中,相反,你必须确保所述jar位于服务器上的所述位置。
由于其他人似乎没有问题(这很奇怪),请检查您是否有任何本地修改,并重新检查他们的warfiles。如果你可以编译好,但warfile不是其他人获得的文件,那么你必须有一些东西。
有关范围here的更多信息。
答案 2 :(得分:0)
使用范围“runtime”而不是“provided”。
来自maven文档:
“runtime-这个范围表明编译时不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径”。
所以在你的情况下它应该是:
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
<scope>runtime</scope>
</dependency>
答案 3 :(得分:0)
我将丢失的罐子放入我的Tomcat libs目录中,Tomcat能够找到它们。这不是正确的方法,但它让我在短期内出局。我需要长期修复POM。