MavenとJARのシステムスコープへの追加


86

AndroidプロジェクトにJARがあり、最終的なAPKに追加したいと考えています。さて、ここに行きます:

    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>android-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
    </dependency>

しかし、私が走っているとき、私はmvn package警告を受けています:

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25

そして最終的なAPKにはJARはありません。

どうすれば修正できますか?


3
この方法でシステムスコープを使用することはできません。install:install-fileを使用します。
bmargulies 2012年

@bmarguliesこのスコープは何のためにあるのか言えますか?
efpies 2012年

1
私はgradleに切り替えましたが、mavenでオープンソースライブラリを使用して一時的にjarをハックしようとしていることを除いてこれらの頭痛はもうありません(これはgradleでとても簡単で、mavenではとても難しいです)。
ディーンヒラー2013年

1
この質問では、Mavenでシステムスコープを使用しないようにする方法について説明しています:stackoverflow.com/questions/3642023/…–
Mark Butler

スコープ「システム」に関する公式ドキュメント:maven.apache.org/guides/introduction/…–
Guillaume

回答:


24

jarをローカルのMavenリポジトリに追加する必要があります。または(より良いオプション)適切なリポジトリ(存在する場合)を指定して、Mavenによって自動的にダウンロードできるようにします

いずれの場合も、<systemPath>依存関係からタグを削除してください


4
その記事を見たことがありますが、maven installそのプロジェクトをビルドしたいすべてのコンピューターで実行したくはありませんでした(残念ながら、このJARはリポジトリに見つかりませんでした)。ありがとう!:)
efpies 2012年

1
ビルドの一部としてスクリプト化できます。
するThorbjörnRavnアンデルセン

143

本当の理由はわかりませんが、Mavenは開発者にすべてのライブラリ(カスタムも)をいくつかのMavenリポジトリにインストールするように促しているため、あまりscope:system好まれていません。簡単な回避策は次のとおりです。maven-install-plugin

使用法に従ってください:

このように依存関係を記述します

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

次に、maven-install-pluginを追加します

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>install-external</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/mylib-core-0.0.1.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.mylib</groupId>
                <artifactId>mylib-core</artifactId>
                <version>0.0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

に注意してphase:cleanください。カスタムライブラリをリポジトリにインストールするには、実行mvn cleanしてから実行する必要があります。mvn install


10
<phase>process-resources</phase>代わりに使用してみませんか<phase>clean</phase>。プロセスリソースフェーズは、このようなシナリオに適しているように見え、常にコンパイルフェーズの前に呼び出されます。
jplandrain 2016年

1
最初のインストールでは、「構築されたライフサイクル」のプロセスリソースの前にある「検証」フェーズを通過できると確信していますか?; )、「クリーンライフサイクルは、」最初の「構築されたライフサイクル」を来て、それが任意の検証、との依存性をしていないtutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r

5
それは機能しますが、どのようにいくつかの依存関係をインストールしますか?
ルノーパウラック2017

6
Stackoverflowは、コミュニティがOPの正解の選択を上書きできるようにする機能を追加する必要があります。これは、IMHO、この回答が受け入れられる必要があるためです。:)
Vijay Chavda 2018年

2
他の人がコメントしているように、cleanフェーズへのバインドは非常に誤解を招くものであり、デフォルトのライフサイクルの一部ではなく、の意味を歪めます clean。さらに、子モジュールに対してカスタム目標を実行するに、依存関係の解決がアグリゲーターによって試行されるため、デフォルトのライフサイクル(validateまたはprocess-resources)でフェーズを使用するために提案された変更は、マルチモジュールの状況では失敗します。
wool.in.silver

14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

これを試して。


11

システムスコープは、「システム」ファイルを処理するためにのみ設計されました。ある固定された場所にあるファイル。/usr/lib、または${java.home}(例tools.jar)内のファイル。.jarプロジェクト内のその他のファイルをサポートするようには設計されていません。

著者は、パス名の展開が正しく機能するようにすることを意図的に拒否し、あなたを落胆させました。その結果、短期的install:install-fileにはローカルリポジトリにインストールするために使用でき、いつかはリポジトリマネージャーを使用して共有することができます。


3

リポジトリマネージャを使用して、この種のjarをそこにインストールします。これにより、ネットワーク内のすべてのコンピューターの問題がすべて解決されます。


3
明日または明日後にローカルサーバーでリポジトリを実行する予定でしたが、その前にこの問題を別の方法で解決する必要があります。
efpies 2012年

1
@efpiesが述べたように、開発者がリポジトリマネージャを作成する権限/能力を持っていない場合、これは空の答えかもしれません。
javadba 2017年

最近では、dockerがインストールされている場合、必要なのはdocker run -d -p 8081:8081 --name nexus sonatype/nexus3-詳細についてはhub.docker.com/r/sonatype/nexus3を参照してください。
するThorbjörnRavnアンデルセン

3

この構成を試してください。それは私のために働いた:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>mywebRoot</warSourceDirectory>
        <warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
            WEB-INF\classes\**,build.*
        </warSourceExcludes>
        <webXml>myproject/source/deploiement/web.xml</webXml>
        <webResources>
            <resource>
                <directory>mywebRoot/WEB-INF/lib</directory>
                <targetPath>WEB-INF/lib</targetPath>
                <includes>
                        <include>mySystemJar1.jar.jar</include>
                         <include>mySystemJar2.jar</include>
                   </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

0

mvn install:install-file -DgroupId = com.paic.maven -DartifactId = tplconfig-maven-plugin -Dversion = 1.0 -Dpackaging = jar -Dfile = tplconfig-maven-plugin-1.0.jar -DgeneratePom = true

jarをローカルリポジトリにインストールします。


3
これは、pomから直接追加するよりも面倒です。
Pradeeban Kathiravelu 2016年

0

Ging3rのおかげで私は解決策を得ました:

次の手順を実行します:

  1. 依存関係タグでは使用しないでください。pom.xmlファイルの依存関係タグで次を使用します::

    <dependency>
    <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
    <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
    <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
        <artifactId>suitetalk-client-v2019_1</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.common</groupId>
        <artifactId>suitetalk-client-common</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. pom.xmlファイルのpluginsタグで次のコードを使用します。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>suitetalk-proxy</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
                        <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
                        <artifactId>suitetalk-client-v2019_1</artifactId>
                        <version>2.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client-common</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.common</groupId>
                        <artifactId>suitetalk-client-common</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

私はlibフォルダーから3つのjarファイルを含めています:

SpringBootプロジェクトに外部jarを含める

最後に、使用mvn cleanして、mvn installまたは「MVNクリーンインストール」とターゲットフォルダまたは(参照インストールパスからだけ実行jarファイルmvn installのログを):

java -jar abc.jar

注:jenkinsで作業している場合は、最初に使用mvn cleanしてからmvn clean installコマンドを使用することを覚えておいてください。以前のコードではmvn clean install、依存関係のためにキャッシュを保存するためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.