Maven应用程序缺少运行时jar

时间:2013-10-10 09:51:21

标签: java maven tomcat intellij-idea

我有一个需要外部罐子的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>

4 个答案:

答案 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。