如何在 Maven POM 中处理第三方 JAR 和远程存储库?
How to handle 3rd party JARs and remote repository in Maven POM?
我正在使用需要设置远程存储库的 Maven 依赖项。在同一个项目中,我正在使用自定义构建的 JAR 并尝试将其添加为依赖项。问题是我收到错误消息说 Maven 无法在远程存储库中找到我的自定义 JAR。
在我的 POM 中,我有多个依赖项,包括我自定义构建的依赖项和需要远程存储库(融合)的依赖项。我曾尝试将我的自定义依赖项放在 POM 中的第一位,但这没有帮助。我尝试从 POM 中删除存储库,但我没有收到关于我的自定义构建依赖项的错误,但我收到了远程依赖项的错误。
我正在 运行Maven Docker 容器中编写代码。我已经尝试 运行 将 Docker 容器与 Bash shell 连接起来并且没有 Maven 命令,然后在容器内手动 运行 Maven 命令,并且手动检查 ~/.m2/repository
并确认我的自定义构建 JAR 在那里。
运行 一个交互式 Maven 容器:
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven \
-w /usr/src/mymaven maven:3.3-jdk-8 /bin/bash
在 Docker 容器内:
mvn clean install:install-file \
-Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT.jar \
-DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar
mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"
ls ~/.m2/repository
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>atlas</groupId>
<artifactId>processed-obs-generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>processed-obs-generator</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>atlas.daas-utilities</groupId>
<artifactId>daas-utilities</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>confluent</id>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>
</project>
我 运行 代码作为 Docker 容器,命令为:
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven \
-w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install:install-file \
-Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT.jar \
-DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar; \
mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"
我收到错误:
Failed to execute goal on project processed-obs-generator: Could not resolve dependencies for project atlas:processed-obs-generator:jar:0.0.1-SNAPSHOT: Could not find artifact atlas.daas-utilities:daas-utilities:jar:0.0.1-SNAPSHOT in confluent (https://packages.confluent.io/maven/)
我也试过下载 confluent jar,将它放在我放置自定义 jar 的相同位置,以相同的方式安装它,并从我的 pom.xml 中删除远程存储库。然后我在使用 ClassNotFoundException.
时遇到错误 类
在您的 install-file
命令中定义 -DgroupId=atlas
而您的 POM 读取:
...
<dependency>
<groupId>atlas.daas-utilities</groupId>
...
我解决了。
我重建了包含依赖项的实用程序 jar。请参阅 Including dependencies in a jar with Maven。
虽然我删除了一些未使用的依赖项,但我的 pom 几乎保持不变。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>atlas</groupId>
<artifactId>daas-utilities</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>confluent</id>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>
我将自定义构建的 jar 放在 ${project.basedir}/libs 中。
我在 docker 运行 命令中调整了 maven 命令,以将我的 jar 包含在依赖项中。我还发现 mvn install:install-file ...
只是在安装 jar 而不是(正如我假设的那样)也在安装你的项目。所以,我在执行它之前在最后添加了另一个 mvn clean install
命令。
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install:install-file -Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT-jar-with-dependencies.jar -DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar; mvn clean install; mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"
我正在使用需要设置远程存储库的 Maven 依赖项。在同一个项目中,我正在使用自定义构建的 JAR 并尝试将其添加为依赖项。问题是我收到错误消息说 Maven 无法在远程存储库中找到我的自定义 JAR。
在我的 POM 中,我有多个依赖项,包括我自定义构建的依赖项和需要远程存储库(融合)的依赖项。我曾尝试将我的自定义依赖项放在 POM 中的第一位,但这没有帮助。我尝试从 POM 中删除存储库,但我没有收到关于我的自定义构建依赖项的错误,但我收到了远程依赖项的错误。
我正在 运行Maven Docker 容器中编写代码。我已经尝试 运行 将 Docker 容器与 Bash shell 连接起来并且没有 Maven 命令,然后在容器内手动 运行 Maven 命令,并且手动检查 ~/.m2/repository
并确认我的自定义构建 JAR 在那里。
运行 一个交互式 Maven 容器:
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven \
-w /usr/src/mymaven maven:3.3-jdk-8 /bin/bash
在 Docker 容器内:
mvn clean install:install-file \
-Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT.jar \
-DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar
mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"
ls ~/.m2/repository
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>atlas</groupId>
<artifactId>processed-obs-generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>processed-obs-generator</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>atlas.daas-utilities</groupId>
<artifactId>daas-utilities</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>confluent</id>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>
</project>
我 运行 代码作为 Docker 容器,命令为:
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven \
-w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install:install-file \
-Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT.jar \
-DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar; \
mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"
我收到错误:
Failed to execute goal on project processed-obs-generator: Could not resolve dependencies for project atlas:processed-obs-generator:jar:0.0.1-SNAPSHOT: Could not find artifact atlas.daas-utilities:daas-utilities:jar:0.0.1-SNAPSHOT in confluent (https://packages.confluent.io/maven/)
我也试过下载 confluent jar,将它放在我放置自定义 jar 的相同位置,以相同的方式安装它,并从我的 pom.xml 中删除远程存储库。然后我在使用 ClassNotFoundException.
时遇到错误 类在您的 install-file
命令中定义 -DgroupId=atlas
而您的 POM 读取:
...
<dependency>
<groupId>atlas.daas-utilities</groupId>
...
我解决了。
我重建了包含依赖项的实用程序 jar。请参阅 Including dependencies in a jar with Maven。
虽然我删除了一些未使用的依赖项,但我的 pom 几乎保持不变。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>atlas</groupId>
<artifactId>daas-utilities</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>confluent</id>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>
我将自定义构建的 jar 放在 ${project.basedir}/libs 中。
我在 docker 运行 命令中调整了 maven 命令,以将我的 jar 包含在依赖项中。我还发现 mvn install:install-file ...
只是在安装 jar 而不是(正如我假设的那样)也在安装你的项目。所以,我在执行它之前在最后添加了另一个 mvn clean install
命令。
docker run -it --rm --name ProcessedObsGen -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install:install-file -Dfile=/usr/src/mymaven/libs/daas-utilities-0.0.1-SNAPSHOT-jar-with-dependencies.jar -DgroupId=atlas -DartifactId=daas-utilities -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar; mvn clean install; mvn exec:java -Dexec.mainClass="atlas.processed_obs_generator.App"