如何在 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"