Java 指定JAR由应用程序容器提供以使其不应包含在EAR或WAR文件中的正确方法是什么?
我有一个JAR,它依赖于应用程序容器提供的另一个JAR(因此它不包括在WAR文件中)。但是,当该组件在不同的独立应用程序中使用时,它需要包含在包中。 指定JAR是由应用程序容器提供的,因此它不应该包含在EAR或WAR文件中,而是在打包到独立应用程序中时包含在其中的正确方法是什么 以下是依赖关系树:Java 指定JAR由应用程序容器提供以使其不应包含在EAR或WAR文件中的正确方法是什么?,java,maven,dependency-management,Java,Maven,Dependency Management,我有一个JAR,它依赖于应用程序容器提供的另一个JAR(因此它不包括在WAR文件中)。但是,当该组件在不同的独立应用程序中使用时,它需要包含在包中。 指定JAR是由应用程序容器提供的,因此它不应该包含在EAR或WAR文件中,而是在打包到独立应用程序中时包含在其中的正确方法是什么 以下是依赖关系树: WAR(app1) JAR(app2) + + | | v v Dependency + | v Dependency (provi
WAR(app1) JAR(app2)
+ +
| |
v v
Dependency
+
|
v
Dependency (provided by the application server)
这是JAR的pom.xml,它依赖于应用程序容器提供的JAR,但如果构建独立应用程序,则需要它
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testgroup</groupId>
<artifactId>moduledao</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
</dependencies>
</project>
4.0.0
测试组
模化
罐子
1
com.oracle.jdbc
ojdbc7
12.1.0.2
这是web应用程序的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testgroup</groupId>
<artifactId>mywebapp</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>testgroup</groupId>
<artifactId>moduledao</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testgroup</groupId>
<artifactId>standaloneapp</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>testgroup</groupId>
<artifactId>moduledao</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
4.0.0
测试组
mywebapp
战争
1
测试组
模化
1
这是独立应用程序的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testgroup</groupId>
<artifactId>mywebapp</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>testgroup</groupId>
<artifactId>moduledao</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testgroup</groupId>
<artifactId>standaloneapp</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>testgroup</groupId>
<artifactId>moduledao</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
4.0.0
测试组
standaloneapp
罐子
1
测试组
模化
1
正如其他人所说,您需要设置范围
但是
为了在两种不同的情况下使用它,您需要声明两个配置文件,一个是基于应用程序容器的配置文件,另一个是独立应用程序的配置文件,它将有一个名为profile.scope的属性。
在第一种情况下,将在第二种情况下提供和编译,您必须根据需要运行的情况分别使用每个概要文件
像这样的东西
<profile>
<id>appServer</id>
<profile.scope>provided</profile.scope>
</properties>
</profile>
<profile>
<id>standaloneApp</id>
<profile.scope>compile</profile.scope>
</properties>
</profile>
应用服务器
假如
standaloneApp
编译
然后
<scope>${profile.scope}</scope>
${profile.scope}
您需要三个项目:
“core”:应用程序核心,包含所有逻辑和默认打包
“web”:带有war
打包的web应用程序
“standalone”:具有默认打包的独立应用程序
在corepom.xml
中,定义应用程序逻辑所需的所有依赖项,并使用默认范围
在webpom.xml
中,您使用默认范围定义对core的依赖关系,此外,您还使用提供的定义容器提供的所有依赖关系。这些附加的依赖项将基本上覆盖核心中的依赖项,并且最终不会捆绑在.war
中。如果您有任何测试,它们将使用提供的
依赖项运行-如果版本不同,并且您希望确保您的应用程序与应用程序服务器上的版本兼容,这一点很重要。此项目还可能包含一些用于在应用程序容器中运行的附加代码
在standalonepom.xml
中,您定义了对core的依赖关系,以及它独立运行所需的任何依赖关系,如命令行解析库等。此外,您将在此处定义作为独立应用程序运行此应用程序的设置,如maven jar plugin
,以在清单中包含主类。此项目还可能包含一些用于独立运行的附加代码。什么是“独立应用程序”?你是说你的jar是一个包含在其他项目中的库吗?使用提供的@chrylis“独立应用程序”不是在应用服务器中运行的,但只使用java-jar应用程序。jar@PawełGłowacz如果我使用提供的
独立应用程序包中不会包含依赖项,我不明白如果只有一种方法可以构建WAR和JAR,为什么建议使用概要文件。您似乎明白WAR和JAR是同一个应用程序。但它们是不同的应用程序。你说的独立应用程序是什么意思?请更具体一些。发布您的pom.xml
file@JohnSmith那么这两个应用程序有两个不同的pom?我已经发布了模块(取决于应用程序服务器提供的模块)、web应用程序WAR和独立应用程序的pom.xml文件。是的,我有两个不同的pom.xml文件,用于两个不同的应用程序。如果在单机版pom.xml
中几乎没有任何东西可以放,并且几乎没有运行单机版的额外代码(只有一个基本的主类),您可能会尝试将此项目与core合并。你可以,但我建议把它们分开,以确保一切都干净。毕竟,拥有一个额外的Maven项目并不会让你付出任何代价。