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

webapp和独立java应用程序的不同依赖范围,java,tomcat,maven,Java,Tomcat,Maven,我正在使用maven构建一个在Tomcat中运行的Java web应用程序。某些JAR文件(例如mail-1.4.1.JAR和数据库驱动程序)已放在tomcat/lib目录中,maven依赖项设置为“提供”。(我不能100%确定原因,但我认为这与JNDI有关。) 现在,我在同一个Maven项目中构建了一个独立的可执行Java程序,我正试图使用mvn exec:Java执行该程序。毫不奇怪,它找不到mail.jar,我得到了错误java.lang.NoClassDefFoundError:java

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

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

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

您可以阅读

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

您可以阅读


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

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

独立的
javax.mail
邮政
1.4.1
运行时
在其他地方,根据web应用程序的需要,使用提供的范围声明工件

运行时使用:

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


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

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

独立的
javax.mail
邮政
1.4.1
运行时
在其他地方,根据web应用程序的需要,使用提供的范围声明工件

运行时使用:

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


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

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

正如Sonatype在其博客中所写:

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

你所做的似乎并不“专业”。当你开始遇到这样的问题时,你应该始终认为这可能不是你选择的正确解决方案

关于这类问题有很多话题,围绕着用一个pom处理多个工件:

正如拉古拉姆所说,关于如何处理多重环境状况,有一个很好的例子:

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

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

请看这里:


祝你好运:)

拉古拉姆的答案是正确的,但我想指出一点

正如Sonatype在其博客中所写:

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

你所做的似乎并不“专业”。当你开始遇到这样的问题时,你应该始终认为这可能不是你选择的正确解决方案

关于这类问题有很多话题,围绕着用一个pom处理多个工件:

正如拉古拉姆所说,关于如何处理多重环境状况,有一个很好的例子:

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

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

请看这里:


祝你好运:)

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