java - 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>
解决方案
通常,您将 fat jars ( jar-with-dependencies
) 用于独立应用程序,而不是用于依赖项的 jars。
否则,您将冒着您所描述的问题的风险。提供依赖项的最佳方式是将其放在可供用户使用的 Maven 存储库中(您自己维护的或者类似 MavenCentral 的东西)。然后用户只需声明您的<repository>
,将其<dependency>
放入他们的项目中,所有传递解析都由 Maven 完成。
推荐阅读
- c# - GroupBy 与 linq 实体 poco
- go - 如果我的客户端和服务器已经支持每个消息压缩压缩,我是否需要通过 JSON 使用 messagePack 序列化?
- php - Ajax 和 Laravel 500(内部服务器错误)
- excel - 除了用户输入的内容之外,我如何附加这个值?
- hibernate - Hibernate Validation Framework 无法加载 javax PersistenceProvider
- python - 当特定键的值重复时,Python 删除字典项
- wcf - WCF 方法在其 HTTP 动词为 PUT 或 DELETE 时被调用两次
- php - 如何自动刷新 PHP 会话变量
- javascript - 隐藏溢出后环绕文本消失
- python-3.x - gio: file:///tmp/....pdf: 没有应用程序注册为处理此文件