【问题标题】:Add Maven repository to Tomcat's classpath将 Maven 存储库添加到 Tomcat 的类路径
【发布时间】:2014-08-22 11:14:00
【问题描述】:

我正在使用 Maven 和 Tomcat。我必须部署的一些 Web 应用程序使用大量在 Maven 中标记为“已提供”的依赖项。这些依赖关系的一个例子是 spring-context

所以,当我打包项目时,这些依赖项不包含在 WAR 文件的 lib 文件夹中。 正因为如此,我得到了

NoClassDefFoundError: org/springframework/context/ApplicationContext

我无法更改依赖项的范围,如果可能,我不想在 WAR 文件中包含依赖项 JAR。

如何将 Maven 存储库作为类路径添加到 Tomcat,以便它可以解析所有“提供”的依赖项?无需将 JAR 复制到 Tomcat 的 lib 文件夹。

我尝试了 catalina.properties 中的 shared.loader 属性,但它不能递归工作:我必须将每个 JAR 路径添加到属性的值。

【问题讨论】:

  • mvn -Dmdep.outputFile=FILE dependency:build-classpath 会将所有依赖项的完全限定路径名写入FILE,格式适合java -cp。分解此字符串并将依赖项复制到 Tomcat 的共享 lib 目录中应该是一件容易的事。 注意,但是,如果你这样做,你将陷入类路径地狱(这就是我没有发布答案的原因;它会被正确地拒绝为遗忘)。

标签: java maven tomcat classpath noclassdeffounderror


【解决方案1】:

当应用服务器或容器已经拥有一个依赖项时,它会被标记为已提供,并且您不必将其放入战争中。就是这种情况,即 servlets jar,但不是 spring-context。我认为更好的解决方案是将此依赖项标记为“编译”而不是“提供”。

【讨论】:

  • 是的,那将是最好的选择。问题是我无法更改依赖项的范围。遗留项目令人头疼。
  • 您可以重新打包和重新部署项目,但不能更改依赖项的范围,因为它们是“遗留”项目?现在我很好奇...
  • 可能我误用了“遗留”一词。并不是我“不能”。正是由于一些奇怪的团队要求,我“不允许”更改范围。
【解决方案2】:

您在这里几乎没有选择。就像@Andres 说的那样,你要么在 WAR 中添加 JAR,要么将它们添加到 Tomcat 的类路径中(即 lib 文件夹)。

虽然拥有 Maven 感知 类加载器的概念很有趣,但想象一下可能发生的所有可能的 jar 版本冲突。 War A 提供了对 Lib v1.0.1 的依赖项,War B 提供了对 Lib v2.1.0 的依赖项>,用 Tomcat 默默地解决这些...

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多