簡體   English   中英

如何在 Maven POM 中處理 3rd 方 JAR 和遠程存儲庫?

[英]How to handle 3rd party JARs and remote repository in Maven POM?

我正在使用需要設置遠程存儲庫的 Maven 依賴項。 在同一個項目中,我使用自定義構建的 JAR 並嘗試將其添加為依賴項。 問題是我收到錯誤消息,說 Maven 在遠程存儲庫中找不到我的自定義 JAR。

在我的 POM 中,我有多個依賴項,包括我的自定義構建依賴項和需要遠程存儲庫(合流)的依賴項。 我嘗試將我的自定義依賴項放在 POM 中,但沒有幫助。 我嘗試從 POM 中刪除存儲庫,但沒有收到關於我的自定義構建依賴項的錯誤,但我收到了遠程依賴項的錯誤。

我在 Maven Docker 容器中運行代碼。 我已經嘗試使用 Bash shell 運行 Docker 容器並且沒有 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"

我收到錯誤:

無法在項目處理的 obs-generator 上執行目標:無法解決項目 atlas:processed-obs-generator:jar:0.0.1-SNAPSHOT: 找不到工件 atlas.daas-utilities:daas-utilities:jar: 的依賴項: 0.0.1-SNAPSHOT 融合 ( https://packages.confluent.io/maven/ )

我還嘗試下載融合的 jar,將它放在我放置自定義 jar 的相同位置,以相同的方式安裝它,並從我的 pom.xml 中刪除遠程存儲庫。 然后我在使用 ClassNotFoundException 的融合類中遇到錯誤。

我能夠解決它。

我重建了包含依賴項的實用程序 jar。 請參閱使用 Maven 在 jar 中包含依賴項

盡管我刪除了一些未使用的依賴項,但我的 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 run 命令中調整了 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"

在您的install-file命令中,您在 POM 讀取時定義-DgroupId=atlas

       ...
       <dependency>
            <groupId>atlas.daas-utilities</groupId>
            ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM