java - Maven:自定义 .jar 在引用时无法解析正确的依赖项
问题描述
我正在为应用程序构建一些自定义 Spring Boot Starter 依赖项。我已经完成了一些,但遇到了一个我以前从未遇到过的问题。而且我相信这与我如何使用 Maven 打包我的自定义依赖项有关。
正在打包的项目的 pom.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ej.gws.starters</groupId>
<artifactId>mapr-producer-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maprfs-path>/opt/mapr/lib/maprfs-6.0.1-mapr.jar</maprfs-path>
<ojai-driver-path>/opt/mapr/lib/mapr-ojai-driver-6.0.1-mapr.jar</ojai-driver-path>
<flex-json-path>/opt/mapr/lib/flexjson-2.1.jar</flex-json-path>
</properties>
<repositories>
<repository>
<id>mapr-proxy</id>
<name>MapR Releases</name>
<url>http://<Internal Nexus Repository>.com/content/repositories/MapR/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<!-- Spring Boot Starter Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Web Exception Handler -->
<dependency>
<groupId>com.ej.gws.starters</groupId>
<artifactId>web-exception-handler-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- JSON Parser -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
<!--Kafka Client Library for MapR Streams 6.0.1-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.1-mapr-1803-streams-6.0.1</version>
<exclusions>
<!-- Do not package maprfs jar, as per MapR Documentation -->
<exclusion>
<groupId>com.mapr.hadoop</groupId>
<artifactId>maprfs</artifactId>
</exclusion>
<!-- Exclude slf4j transitive dependency to avoid warnings about duplicates -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--Needed by MapR Streams, provided by system Client Library-->
<dependency>
<groupId>com.mapr.hadoop</groupId>
<artifactId>maprfs</artifactId>
<version>6.0.1-mapr</version>
<scope>system</scope>
<systemPath>${maprfs-path}</systemPath>
</dependency>
<dependency>
<groupId>com.mapr.ojai</groupId>
<artifactId>mapr-ojai-driver</artifactId>
<version>6.0.1-mapr</version>
<scope>system</scope>
<systemPath>${ojai-driver-path}</systemPath>
</dependency>
<dependency>
<groupId>net.sf.flexjson</groupId>
<artifactId>flexjson</artifactId>
<version>2.1</version>
<scope>system</scope>
<systemPath>${flex-json-path}</systemPath>
</dependency>
</dependencies>
</project>
我遇到的问题是org.apache.kafka:kafka-clients:1.0.1-mapr-1803-streams-6.0.1
依赖关系。
在构建 .jar 的项目中,该依赖项在 Maven 中如下所示:
但是,在运行 amvn install
并生成工件之后,当我在另一个应用程序中引用它时,该依赖项看起来像这样:
所以,我要问的问题是,我如何以这样的方式编写我的应用程序 pom.xml,当另一个应用程序引用它时,它会导入完全相同的工件和版本?
另外,澄清一下,我不想构建一个胖/超级罐子。
解决方案
不,您无法控制,除非您拥有对另一个应用程序的完全访问权限。如果是这样,您需要手动排除一些重复的依赖项,如下所示:
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
顺便说一句,使用
mvn dependency:tree
经常告诉实际的依赖是什么。
推荐阅读
- python - 如何将“matplotlib”添加到 readthedocs.yaml 或 requirements.txt?
- python - 将保存的 EfficientDet 模型 saved_model.pb 转换为 tflite 格式失败
- python - 如何使用python从另一个窗口读取文本
- python - 缺少数据的 2D 图像中的曲线拟合
- c++ - 实现可打印类而不支付 iostream 编译费用?
- c++ - 创建新的原始数据类型的最佳方法是什么?
- snowflake-cloud-data-platform - Snowflake 无服务器任务创建返回错误
- python - 如果长度超过 2000 个字符,则拆分消息,但不会剪切/断行
- jwt - 云功能和多租户 REST 应用程序
- python - 如何使用 python pil 创建不同的透明度,如渐变?