Mavenは、単純なコマンドラインでサードパーティの依存関係をインストールして展開する

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

質問

どこにもホストされていないサードパーティの依存関係が多数あります。これらのそれぞれに、リポジトリにインストールおよび/または展開できるようにするJARファイルがあります。一部のJARファイルには独自の依存関係があり、これらを宣言する必要があります。

GroupID、ArtifactID、依存関係などを宣言する各JARファイルのpom.xmlファイルを作成しました。これらのpom.xmlファイルにはすべて、共通情報の一部を宣言する共通の親pomがあります(例: <repositories><distributionManagement>).

これらの依存関係を単純なものでインストールまたは展開できるようにしたい mvn installmvn deploy (または多分 mvn install:install-filemvn deploy:deploy-file)そして、これらのコマンドに必要なすべてのプロパティを持っています(artifactId, repositoryId, 、など)pom.xmlファイルから読み取ります。

これを機能させるために、少なくとも展開するために、私は親POMに以下を置いてみました。

<build>
  <plugins>
    <plugin>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <file>${jarfile}</file>
        <pomFile>pom.xml</pomFile>
        <repositoryId>our-id</repositoryId>
        <url>our-url</url>
      </configuration>
    </plugin>
  </plugins>
</build>

そして、それぞれの子供にpoMを持たせることが定義されます jarfile 財産。それは私が走ることを可能にします mvn deploy:deploy-file すべての子供ポンアーティファクトを展開します。おそらく、私は取得するように似たようなことをすることができます mvn install:install-file 働くために。

しかし、このアプローチでは、親POMをリリースすることができません(子供のPOMがそれに依存しているので、これをしなければなりません)、そして私がしようとするなら mvn release:perform 親pomで、次のようなエラーがあります。

Cannot override read-only parameter: pomFile

私はおそらくこれについて間違った方法で行っているように感じます。私が本当にやりたいのは:

  • すべてのサードパーティの瓶の共通コードを1つの共有親POMに入れます
  • サードパーティごとに追加の最小POMを書くjar
  • のようなものを実行できるようになります mvn install また mvn deploy これらすべての複雑なコマンドラインプロパティを指定する必要がありません

どうすればそれを最もよく達成できますか?

編集: 理想的には、私が単純なものと同じくらい単純なものを実行できるようにしたいと思っていることを明確にしました mvn install また mvn deploy コマンドラインにプロパティを指定する必要はありません。

役に立ちましたか?

解決 2

わかりました、私はただ実行できるソリューションを見つけました mvn install また mvn deploy JARファイルをローカルまたはリモートリポジトリにインストールします。に触発された Maven-Usersリストへの投稿 とを使用します ビルドヘルパープラグイン, 、親のpomで、私は持っています:

<pluginManagement>
    <plugins>
        <!-- Attach the jar file to the artifact -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>attach-artifacts</id>
                    <phase>package</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${artifactId}-${version}.jar</file>
                                <type>jar</type>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

そして、子供のポンズに、私は持っています:

<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

最初に私をつまずかせたこの部分のいくつか:

  • attach-artifact 実行は下にある必要があります <pluginManagement> したがって、あなたが実行されない場合は実行されません mvn install また mvn deploy 親pom。
  • 子供は指定する必要があります build-helper-maven-plugin 親からのコードをビルドプラグインの下に <pluginManagement> 実行されます。
  • 子どもたちは持っていると宣言されなければなりません <packaging>pom</packaging> アーティファクトと同じ名前がある場合、jarをアーティファクトに追加できないためです。

このアプローチに見られる唯一の欠点は、アーティファクトがタイプとして展開されることです pom タイプの代わりに jar. 。しかし、私はその本当の結果を見ていません。

他のヒント

Mavenが依存関係を逃している場合、リモートリポジトリにJARを追加するために発行するコマンドラインを含む出力にエラーが発生します。そのコマンドラインは、自動的にPOMを作成し、2つを一緒にアップロードします。それはあなたのニーズに十分ではありませんか?

この施設を使用して、リモートリポジトリ表現がない依存関係があることがわかっている場合は、通常、ビルドでビルドでそれを定義し、ビルドを一度実行してから、ビルドエラーを見てください。展開のコマンドをコピーしてから、そのコマンドを実行します。あなたはあなたが持っていることを確認する必要があります <repository> PARNPOM Plusで適切にセットアップされた要素も対応するセットアップ <server> あなたの要素 settings.xml リポジトリアップロードパスワードを使用して。それ以外は、行くのがいいはずです。

遠くに行く前に、ネクサスをチェックする必要があると付け加えます。今セットアップするのは面倒です! :-)

私は私の仕事でこの問題に会います:

今、私はターゲットを持っています。jar(依存関係リストがあります:A.jar、b.jar、c.jar ...)、私は使いたいです mvn install:install-file それを私のローカルレポジトリに入れますが、コマンドブローを実行するとき

mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance  -DartifactId=target  -Dversion=1.0.0

しかし、私がそれを使用するとき、私は多くのエラーがあることがわかりました、ターゲットを使用するjarはjarが見つかりません a.jar, b.jar, c.jar, 、 そのような:

com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist

それから私は行きました ~/.m2/repository/.../target/1.0.0/target.pom ターゲットのPOMファイルを見つけるが、何もない!

...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!

これが何が悪いのかです install:file -Dfile -DgroupId -D.. POMに依存関係を追加しません、私はこの方法で答えを修正します

  1. すでにあなたがいれば have this maven project source, 、ローカルリポジトリにインストールするだけです

    mvn clean install

  2. もし、あんたが have the jar and the pom of it, 、POMでJARを取り付けます

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. もし、あんたが don't have a pom with target jar, 、1つを書き、上部コマンドを使用します。

  4. POMファイルを回復できない場合は、あきらめる必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top