Java 指定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

我有一个JAR,它依赖于应用程序容器提供的另一个JAR(因此它不包括在WAR文件中)。但是,当该组件在不同的独立应用程序中使用时,它需要包含在包中。 指定JAR是由应用程序容器提供的,因此它不应该包含在EAR或WAR文件中,而是在打包到独立应用程序中时包含在其中的正确方法是什么

以下是依赖关系树:

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”:具有默认打包的独立应用程序
  • 在core
    pom.xml
    中,定义应用程序逻辑所需的所有依赖项,并使用默认范围

    在web
    pom.xml
    中,您使用默认范围定义对core的依赖关系,此外,您还使用提供的
    定义容器提供的所有依赖关系。这些附加的依赖项将基本上覆盖核心中的依赖项,并且最终不会捆绑在
    .war
    中。如果您有任何测试,它们将使用提供的
    依赖项运行-如果版本不同,并且您希望确保您的应用程序与应用程序服务器上的版本兼容,这一点很重要。此项目还可能包含一些用于在应用程序容器中运行的附加代码


    在standalone
    pom.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项目并不会让你付出任何代价。