2

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

4 回答 4

1

对于将来遇到此问题的任何人:

我遇到了完全相同的问题 - pom 中的 jar 在运行时不可用,Java 构建路径中的 jar 也不可用。我能找到的唯一解决方法是将 jar 添加到 tomcat/lib 目录。

原来我的 Maven 本地存储库已损坏 - 我不知道其中有多少,但至少有一部分是。我将 .m2/repository 目录重命名为 oldrepository,再次尝试“全新安装”(所有 jar 文件再次下载需要一段时间),之后一切正常。

希望这可以帮助某人。

于 2016-04-13T14:52:22.257 回答
0

使用范围“运行时”而不是“提供”。

来自 Maven 文档:

“运行时-此范围表示依赖项不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,但不在编译类路径中”。

所以在你的情况下应该是:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.8.1</version>
    <scope>runtime</scope> 
</dependency>
于 2013-10-10T10:19:19.080 回答
0

检查您是否有使用 a 声明的依赖项<scope>provided</scope>,或者它们可能是偶然在test-scope 中的。Maven 不会将这些依赖项打包到您的 warfile 中。

如果它们不是经典依赖项,而是以另一种方式添加到类路径的真实外部 jar,即 Maven 无法访问,您可能希望将它们安装到本地存储库中,mvn install:install-file以使它们被 Maven 正确识别。

如果您出于任何原因无法将 jar 安装到本地存储库,则另一个选项可能是system您提供所述 jar 的确切位置的范围,但这也不会将 jar 打包到 warfile 中,相反,您必须确保该 jar 位于服务器上的所述位置。

由于其他人似乎没有问题(这很奇怪),请检查您是否有任何本地修改,并重新检查他们的 warfile。如果您可以正常编译,但 warfile 与其他人获得的文件不同,那么您肯定有一些问题。

更多关于范围的信息

于 2013-10-10T10:03:20.267 回答
0

我将丢失的 jar 放入我的 Tomcat 库目录中,Tomcat 能够找到它们。这不是正确的方法,但它让我在短期内出局。我需要长期修复 POM。

于 2013-10-11T14:36:12.037 回答