build.gradleファイルにローカル.jarファイルの依存関係を追加するにはどうすればよいですか?


608

だから私は自分のbuild.gradleファイルにローカル.jarファイルの依存関係を追加しようとしました:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
} 

そして、ここで.jarファイルをreferenceLibrariesフォルダーに追加したことがわかります。https//github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

しかし問題は、コマンドを実行すると、次のエラーが発生することです。

error: package com.google.gson does not exist
import com.google.gson.Gson;

これが私のリポジトリ全体です:https//github.com/WalnutiQ/wAlnut/tree/version-2.3.1


コンパイルではなくランタイムについて確信がありますか?ファイルのコンパイル(....)
Gabriele Mariotti

3
jarを構築できない場合は、コンパイル依存関係のようです。試してください:それでも問題が解決しない場合は、ファイル( 'libs / mnist-tools.jar'、 'libs / gson-2.2.4.jar')をコンパイルしてから、問題がある可能性があるため絶対パスを試してください。
patrz jaka franca

1
このスタックオーバーフローの質問で、ようやく必要な答えが得られました。
2014年

回答:


456

ローカルディレクトリから本当に.jarを取得する必要がある場合は、

モジュールのgradleの横に追加します(アプリのgradleファイルではありません):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

しかし、実際のmavenリポジトリーの標準.jarであるため、これを試してみませんか?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}

4
私は、まさにこのために探して来たが、私は私のローカルリポジトリが推移依存関係を解決しないことがわかった(Gradleでは2.7、例えば、POMはcom.mojangです:authlib:minecraftforge.netによって抽出されたよう1.5.21)。
カール・パガン

1
複数のディレクトリにローカルjarファイルがある場合は、それらすべてをflatDirに追加する必要があります。例:-flatDir {dirs 'libs1'、 'libs2'、 'libs3'}
Dhumil Agarwal

9
gradle.buildファイルがあります-「アプリグラドルファイル」と「モジュールグラドル」とは何ですか?
Lealo

2
誰かがこれらの機能を説明する公式のGradleドキュメントセクションへのリンクで回答を更新する可能性はありますか?
ミサンロープ

2
implementation(":gson:2.2.4")それを行う方法のようです。
Eng.Fouad 2018

697

ドキュメントによると次のようにローカルjar依存関係の相対パスを使用します。

dependencies {
    implementation files('libs/something_local.jar')
}

8
それが今で文書化されています@Gubatron:gradle.org/docs/current/userguide/...
デヴィッド・モグラ

7
jarへの相対パスを使用している人のためにそれを追加したいだけです:Groovyはパスを評価するために依存関係{compile files( "libs / something_local.jar"}(つまり、二重引用符ではなく二重引用符))が必要です。引用は文字通りGroovyで行われます
specialk1st

したがって、同じものを使用していて、コンパイルエラーが発生します(そこにjarが見つからないようです)。絶対パスを指定すると、正常に動作します。
RV_Dev 2017

私はこの解決策を好みますが、ファイルが存在しない場合、Gradleはエラーを出力しません。私はこれを個人的に見つけました、詳細についてはこのSOの質問を参照してください:stackoverflow.com/q/42527631/4851565
entpnerd

このソリューションを使用した後でも、同様のエラーが発生しました。間違い私はlibsフォルダーをアプリと同じレベルではないアプリの下に配置しました
Rishabh Dugar

315

ローカルリポジトリにすべてのJARを含めることもできます。これにより、毎回指定する必要がなくなります。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

3
これは、libディレクトリー内のすべてのjarをコンパイルするために使用されます。その完璧な解決策(y)
シェラズアフマドキルジ

1
...そのlibsディレクトリを、サーバーコードをクライアントコードに含めない、または異なるサブモジュールに複数のバージョンの依存関係を持たないなど、異なる依存関係のセットを持つ異なるモジュールと共有する予定がない限り。
Ajax

これは、ファイルの場所を明示的に示すため、受け入れられた回答よりも好ましい実装です。一部のライブラリについてはmavenCentralなどのリポジトリを参照し、他のライブラリについてはローカルコピーを参照する場合に役立ちます。その場合、gradleが他のリポジトリ内のローカルライブラリを検索する間、遅れが生じる可能性があります。
satbot

1
dirも絶対パスにすることができることに注意してください。また、「include」の代わりに「includes」を使用する必要がありました。
エリエルマリモン2017

53

次は私のために働きます:

compile fileTree(dir: 'libs', include: '*.jar')

Gradleのドキュメントを参照してください。


6
素晴らしい答え、何日も検索した後に私にとって有効だった唯一の解決策
Stardust

特定のライブラリをプロジェクトでコンパイルしたくない場合は、この方法であることを覚えておくことが重要です。ライブラリをlibsフォルダーから削除することを忘れないでください...どのライブラリが表示されないので、この方法は好きではありません。私が図書館に入らない限り追加
ジーザス・ディムリックス'19

1
これは@Nightwolfの答えとどう違うのですか?
トレントン

2
タイプorg.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandlerのオブジェクトの引数[ディレクトリ 'libs']のメソッドcompile()が見つかりませんでした
ieXcept

33

GradleのローカルMavenリポジトリを再利用してみてください。

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

    mvn install:install-file -Dfile=utility.jar -DgroupId=com.company -DartifactId=utility -Dversion=0.0.1 -Dpackaging=jar

  • ~/.m2/ローカルのMavenリポジトリに jarがインストールされていることを確認してください

  • build.gradleファイルでローカルMavenリポジトリを有効にします。

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • これで、jarをプロジェクトに実装できるようになります。

これは他のすべてが失敗したときに私を助けました!
User3

これは機能しますが、これは回避策であり、ビルドシステムに.m2フォルダー(mavenインストール)があるという追加の依存関係が追加されるため、自動化された本番環境/ステージ環境では使用しないでください。
saurav.varma

29

受け入れられた答えは良いですが、同じサードパーティのJavaライブラリを使用するには、マルチプロジェクトのGradleビルド内にさまざまなライブラリ構成が必要でした。

$ rootProject.projectDir」を「allprojects」クロージャ内の「dir」パス要素に追加すると、各サブプロジェクトが同じ「libs」ディレクトリを参照し、そのサブプロジェクトのローカルバージョンを参照しなかったことを意味します。

//gradle.build snippet
allprojects {
    ...

    repositories {
        //All sub-projects will now refer to the same 'libs' directory
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

Quizzieによる編集:「$ {rootProject.projectDir}」を「$ rootProject.projectDir」に変更しました(最新のGradleバージョンで動作します)。


2
しかし、ライブラリのbuild.gradleファイルでこのlibsフォルダーを参照するにはどうすればよいですか?それに関する助け。
jeevs 2015

1
「$ {rootProject.projectDir}」を「$ rootProject.projectDir」に変更するだけで、再び機能します。
Quizzie 2015年

4
後者は補間されないため、単一引用符ではなく二重引用符を使用してください。
FPフリー2016

1
このアプローチは私を助けました。
Shreyash

1
ここでのすべての答えは私に大いに役立ちました。このパターンは私たちが使用しているものであり、チームで作業している人々がブランチで作業するときにJARをそのディレクトリにドロップするだけで簡単になります。
ルーシー

12

これを行う簡単な方法は

compile fileTree(include: ['*.jar'], dir: 'libs')

アプリのlibsディレクトリにあるすべての.jarファイルをコンパイルします。


fileTreeは、libsフォルダー内のすべてのサブディレクトリーに対して機能しますか。libs / sping / spring.jar内のいくつかのjarの例、この場合は、spring .jarも含まれていますか?
マネージャー

いいえ、ありません。技術的には、ライブラリのサブディレクトリではなく「dir:libs」を指定しているため、同様にすべきではありません。
ZygoteInit 2016年

この場合は、最小限のタスクですべてのライブラリをサブディレクトリから取得する方法(プロジェクトには非常に多くのサブディレクトリが含まれているため)
mgr

返事が遅れて申し訳ありません@mallikgmねえ、あなたは(含める:[「コンパイルfileTreeのようなディレクトリのパスにワイルドカードを追加しようとしたんでしたの.jar」]、DIR「LIBS」)
ZygoteInit

2
これは@Nightwolfの答えとどう違うのですか?
トレントン

12

Kotlin DSLを使用する人のためのソリューション

これまでに追加されたソリューションはOPに最適ですが、最初に翻訳しないとKotlin DSLで使用できません。Kotlin DSLを使用してビルドにローカル.JARを追加した例を次に示します。

dependencies {
    compile(files("/path/to/file.jar"))
    testCompile(files("/path/to/file.jar"))
    testCompile("junit", "junit", "4.12")
}

Windowsを使用している場合は、バックスラッシュをエスケープする必要があることに注意してください。

...
compile(files("C:\\path\\to\\file.jar"))
...

また、引用符は一重引用符ではなく二重引用符でなければならないことも覚えておいてください。


2020年の編集:

Gradleの更新は非推奨にcompileなりtestCompile、およびに移行implementationしましたtestImplementation。したがって、上記の依存関係ブロックは、現在のGradleバージョンでは次のようになります。

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}

1
+1は私のために働いた!jarファイルを作成せずに同じことを行う方法を知っていますか(たまたまjarを作成した場合)。
カリームJeiroudi

2
@KareemJeiroudi私はあなたの質問を誤解するかもしれないが、あなたはモジュールにプロジェクトの依存関係を作りについて話している場合、あなたはこのようなものだろう:compile(project(":MyProject"))「MyProjectとは、」自分の中で定義されているsettings.gradleようなものでファイルをinclude("MyProject")
ジョナサンランドラム

8

上記のhttps://stackoverflow.com/a/20956456/1019307の提案が機能しませんでした。これは私にとってもうまくいきました。プロジェクトのルートのディレクトリsecondstring-20030401.jarに保存したファイルの場合libs/

repositories {
    mavenCentral()
    // Not everything is available in a Maven/Gradle repository.  Use a local 'libs/' directory for these.
    flatDir {
       dirs 'libs'
   }
}

...

compile name: 'secondstring-20030401'

ありがとうございました!なぜだか分かりませんが、これだけが私にとってうまくいきました。私のプロジェクトルートに「libs」フォルダーを作成し、そこに.jarを押し込み、「コンパイル名」エントリをコピーしました。もちろん、.jar拡張子も削除しました。
anon58192932 2017

いや、これは私にはうまくいきません:miglayout-core:が見つかりませんでした。次の場所で検索:file:/user/path/to/miglayout-core.jar
Well Smith

あなたがリポジトリとして、ファイルのディレクトリを追加したい場合は、この作品:docs.gradle.org/current/userguide/...
Grubhart

7

質問はすでに詳細に回答されています。私はまだ私にとって非常に驚くべきものを追加したいと思います:

「段階的な依存関係」タスクは、ファイルの依存関係をリストしません。あなたはそう思うかもしれませんが、結局、それらは「依存関係」ブロックで指定されているためです。

したがって、参照されたローカルlibファイルが正しく機能しているかどうかを確認するために、この出力に依存しないでください。


6

私のために働いた解決策は、build.gradleファイルでのfileTreeの使用です。依存関係として追加する必要がある.jarをlibsフォルダーに保持します。build.gradleのdependenicesブロックに以下のコードを与えます:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

5

これを行う最良の方法は、これをbuild.gradleファイルに追加して同期オプションを押すことです

dependency{
    compile files('path.jar')
}

3

あなたはjarを追加することができます:

Gradleの場合は、次のコードを入力しbuild.gradleます。

dependencies {
...
compile fileTree(dir: 'lib', includes: ['suitetalk-*0.jar'])
...
}

とmavenの場合は次の手順に従ってください:

Intellijの場合:ファイル->プロジェクト構造->モジュール->依存関係タブ-> +記号をクリック-> jarおよび依存関係->インポートするjarを選択-> ok->適用(表示されている場合)-> ok

java.lang.NoClassDefFoundError: Could not initialize class実行時に例外が発生した場合は、jarの依存関係がインストールされていないため、親プロジェクトにすべての依存関係を追加する必要があることに注意してください。


0

Goto File-> Project Structure-> Modules-> app-> Dependencies Tab-> Click +(button)-> Select File Dependency-> Select jar file in the lib folder

この手順により、依存関係がgraldeに自動的に追加されます

とてもシンプル


3
それはいくつかのJava IDEメニューのパスですか?おそらくアイデア?
ウトガルダ2016年

1
はい、それはIntelliJ IDEAにとっては何かのように見え、私はそれがうまくいくとは思いません。または、「同期」が行われるGradleセットアップに変更が加えられ、GradleからIntelliJ設定への一方向の同期が行われるまで、機能しているように見えます。それは他の方法では同期しません-少なくとも私はそうは思いません。
RenniePet

1
自動インポートを選択した場合、手動でインポートされた.JARは、への次の変更時に削除されbuild.gradleます。
ジョナサンランドラム

-1

継続的インテグレーションを使用している場合は、ビルドサーバーの同じパスにライブラリを追加する必要があることに注意してください。

このため、ローカルリポジトリにjarを追加し、もちろん、ビルドサーバーでも同じことを行います。


-3

別の方法:

ライブラリをツリービューに追加します。これを右クリックします。メニュー「ライブラリとして追加」を選択します。ダイアログが表示され、モジュールを選択できます。OK、それで終わりです。

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