webapp和独立java应用程序的不同依赖范围

时间:2012-06-06 10:14:46

标签: java tomcat maven

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

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

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

3 个答案:

答案 0 :(得分:2)

您可以阅读introduction to profiles

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

答案 1 :(得分: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最重要的核心概念之一:模块化。

你在做什么似乎不是在“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 :(得分: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

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