1

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

现在,我在尝试使用mvn exec:java. 不出所料,它找不到mail.jar,我得到了错误java.lang.NoClassDefFoundError: javax/mail/Session

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

4

3 回答 3

2

您可以阅读简介简介

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

于 2012-06-06T12:10:05.843 回答
2

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 处理多个工件:

处理来自单个 Maven 项目的多个工件

Maven:附加多个工件

...

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

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

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

...

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

祝你好运 :)

于 2012-06-06T12:29:15.703 回答
0

是的,正如 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>

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

运行使用:

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

但我不相信使用配置文件是正确的答案。

于 2012-06-06T12:18:58.833 回答