Maven:打包和依赖性解析

时间:2019-09-13 04:32:45

标签: java maven

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

        <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>

此胖子缸现在包含打包的Utils项目的所有依赖项。如果客户端应用程序也使用Maven依赖项,但版本不同,则会带来依赖项解决问题。

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

我的Project1依赖项:

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

我的实用程序依赖项:

<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>

2 个答案:

答案 0 :(得分:0)

通常,您对独立应用程序使用胖jar(jar-with-dependencies),而不是对依赖关系的jar使用。

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

答案 1 :(得分:-1)

将Maven项目导入另一台计算机后的过程是,如果尚未在该计算机上下载Maven可执行文件的依赖关系,则该可执行文件将再次在Internet上下载该项目的依赖关系?怎么样?如果该目录中已经存在该JAR,则Maven将查看C:\Users\<user>\.m2(Windows)或~\.m2(Linux)目录。如果尚不存在,则Maven将下载尚不存在的每个依赖项。