【问题标题】:Different dependency scope for webapp and standalone java appwebapp 和独立 java 应用程序的不同依赖范围
【发布时间】:2012-06-10 08:26:11
【问题描述】:

我正在使用 maven 构建一个在 Tomcat 中运行的 Java Web 应用程序。某些 JAR 文件(例如 mail-1.4.1.jar 和数据库驱动程序)已放在 tomcat/lib 目录中,并且 maven 依赖项设置为“已提供”。 (我不是 100% 确定原因,但我认为这与 JNDI 有关。)

现在我在我尝试使用mvn exec:java 执行的同一个Maven 项目中构建了一个独立的可执行Java 程序。不出所料,它找不到mail.jar,我收到错误java.lang.NoClassDefFoundError: javax/mail/Session

如何为独立的 Java 程序指定 javax.mail scope="runtime" 同时仍然为 Tomcat 应用程序“提供”?我必须使用 Maven 配置文件吗?如果是这样,我在哪里可以找到有关其工作原理的有用文档(配置文件的依赖项是附加的还是它们会覆盖默认的依赖项等?)

【问题讨论】:

  • 如果你有两个不同意图的 web 应用程序和一个 java 应用程序的执行,你应该有两个不同的 maven 模块。一个用于 web 应用程序,一个用于命令行应用程序。否则你会遇到麻烦。

标签: java tomcat maven


【解决方案1】:

Raghuram 的答案是正确的,但我想指出一点。

正如 Sonatype 在其博客中所写:http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

我想非常清楚这个答案。我们强烈建议您不要将 Maven 项目配置为从单个项目创建两个单独的 JAR。它违反了 Maven 最重要的核心概念之一:模块化。

您正在做的事情似乎不在“The Maven Way”中。当你开始被这样的问题困扰时,你应该始终认为这可能不是你选择的正确解决方案。

关于这种问题有很多话题,关于用一个 pom 处理多个工件:

Handling multiple artifacts from single maven project

Maven: Attaching multiple artifacts

...

正如 Raghuram 所建议的,关于如何处理多个环境配置文件有一个很好的建议: Maven best practice for generating artifacts for multiple environments [prod, test, dev] with CI/Hudson support?

因此,我建议您拆分项目,考虑它们之间的真正关系。 它可能会驱使您进入一个多模块项目,例如

parent
|
+--project:jar
|
+--web-app:war

...

看这里:http://www.sonatype.com/books/mvnex-book/reference/multimodule.html

祝你好运:)

【讨论】:

    【解决方案2】:

    您可以阅读introduction to profiles

    当配置文件处于活动状态时,配置文件中声明的依赖项的范围将覆盖默认范围。因此,您应该能够为您的个人资料中的相关 jar 指定 <runtime> 范围,并使其可用于您的标准应用程序。

    【讨论】:

      【解决方案3】:

      是的,正如 Raghuram 所建议的,创建具有不同范围的依赖项的配置文件是可行的。

      <profiles>
          <profile>
              <id>standalone</id>
              <dependencies>
                  <dependency>
                      <groupId>javax.mail</groupId>
                      <artifactId>mail</artifactId>
                      <version>1.4.1</version>
                      <scope>runtime</scope>
                  </dependency>
              </dependencies>
          </profile>
      </profiles>
      

      根据网络应用的需要,在其他地方使用提供的范围声明工件。

      运行使用:

      mvn exec:java -Dexec.mainClass=XXX -Pstandalone

      但我不相信使用个人资料是正确的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        相关资源
        最近更新 更多