首页 > 解决方案 > Maven:打包和依赖解析

问题描述

我的 Maven 项目 Project1 只有一个依赖项,即 Utils(这又是我的本地 Maven 项目)。我必须将我的项目作为独立 jar 分发,以便在客户端应用程序中使用。我使用以下 maven 程序集插件来生成 fat jar。

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>myMainClass</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

这个胖 jar 现在包含打包的 Utils 项目的所有依赖项。如果客户端应用程序也使用 Maven 依赖项,但版本不同,这将带来依赖项解析问题。

有没有一种方法可以让我在没有依赖项的情况下打包 Utils 并让 Maven 在客户端位置下载 Utils 依赖项?

我的 Project1 依赖项:

<dependencies>
    <dependency>
        <groupId>com.sample</groupId>
        <artifactId>Utils</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies> 

我的 Utils 依赖项:

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.9.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${version.log4j}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${version.log4j}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${version.log4j}</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.1</version>
    </dependency>
 </dependencies>

标签: javamaven

解决方案


通常,您将 fat jars ( jar-with-dependencies) 用于独立应用程序,而不是用于依赖项的 jars。

否则,您将冒着您所描述的问题的风险。提供依赖项的最佳方式是将其放在可供用户使用的 Maven 存储库中(您自己维护的或者类似 MavenCentral 的东西)。然后用户只需声明您的<repository>,将其<dependency>放入他们的项目中,所有传递解析都由 Maven 完成。


推荐阅读