我正在使用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配置文件吗?如果是这样,我在哪里可以找到有关其工作原理的有用文档(配置文件的依赖项是否添加或是否覆盖默认值等?)
答案 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
但我不相信使用个人资料是正确的答案。