Làm cách nào để thêm phụ thuộc tệp .jar cục bộ vào tệp build.gradle?


608

Vì vậy, tôi đã cố gắng thêm phụ thuộc tệp .jar cục bộ vào tệp build.gradle của mình:

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')
} 

Và bạn có thể thấy rằng tôi đã thêm các tệp .jar vào thư mục Thư viện tham chiếu tại đây: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedL Library

Nhưng vấn đề là khi tôi chạy lệnh: gradle build trên dòng lệnh tôi gặp lỗi sau:

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

Đây là toàn bộ repo của tôi: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


Bạn có chắc chắn về thời gian chạy thay vì biên dịch? biên dịch các tập tin (....)
Gabriele Mariotti

3
có vẻ như nó là phụ thuộc biên dịch nếu jar không thể được xây dựng. thử: biên dịch các tệp ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') nếu bạn vẫn gặp sự cố, sau đó thử các đường dẫn tuyệt đối có thể là vấn đề.
patrz jaka franca

1
Đây câu hỏi Stack Overflow cuối cùng đã cho tôi câu trả lời tôi cần.
vươn

Câu trả lời:


456

Nếu bạn thực sự cần lấy .jar từ một thư mục địa phương,

Thêm bên cạnh lớp mô-đun của bạn (Không phải tệp lớp ứng dụng):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Tuy nhiên, là một .jar tiêu chuẩn trong kho lưu trữ maven thực tế, tại sao bạn không thử điều này?

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

4
Tôi đã tìm kiếm chính xác điều này, nhưng tôi thấy rằng kho lưu trữ cục bộ của tôi không giải quyết được các phụ thuộc bắc cầu. (Lớp 2.7, ví dụ POM là com.mojang: authlib: 1.5.21 như được trích xuất bởi minecraftforge.net)
Karl the Pagan

1
Nếu bạn có tệp jar cục bộ trong nhiều thư mục, bạn cần thêm tất cả chúng vào FlatDir. Ví dụ: - FlatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal

9
Tôi đang có một gradle.buildtệp - "tệp lớp ứng dụng" này là gì và "lớp mô-đun" là gì?
Lealo

2
Bất kỳ ai cũng có thể cập nhật câu trả lời với một liên kết đến phần tài liệu chính thức của Gradle mô tả các tính năng này?
misanthrope

2
implementation(":gson:2.2.4")dường như là cách để làm điều đó
Tiếng Anh.

697

Theo tài liệu , sử dụng đường dẫn tương đối cho phụ thuộc jar cục bộ như sau:

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

8
@Gubatron nó được ghi lại ngay bây giờ: gradle.org/docs/c
David Moles

7
chỉ muốn thêm rằng đối với những người đang sử dụng các đường dẫn tương đối vào tệp jar của chúng tôi: tệp phụ thuộc {compile ("libs / Something_local.jar"} (tức là trích dẫn kép không phải dấu ngoặc đơn) để Groovy đánh giá đường dẫn. trích dẫn được thực hiện theo nghĩa đen trong Groovy.
Specialk1st

Vì vậy, tôi đang sử dụng cùng một thứ và tôi gặp lỗi biên dịch (có vẻ như nó không tìm thấy bình ở đó.) Nếu tôi đưa ra đường dẫn tuyệt đối thì nó hoạt động tốt.
RV_Dev

Tôi thích giải pháp này, nhưng tôi thấy rằng nếu tệp không tồn tại, không có lỗi nào được đưa ra bởi Gradle. Tôi đã tìm thấy cá nhân này, Xem câu hỏi SO này để biết chi tiết: stackoverflow.com/q/42527631/4851565
entpnerd

tôi đã nhận được một lỗi tương tự ngay cả sau khi sử dụng giải pháp này. Sai lầm tôi đã đặt thư mục libs trong các ứng dụng không cùng cấp với ứng dụng
Rishabh Dugar

315

Bạn cũng có thể làm điều này bao gồm tất cả các JAR trong kho lưu trữ cục bộ. Bằng cách này, bạn sẽ không phải chỉ định nó mỗi lần.

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

3
Điều này được sử dụng để biên dịch tất cả các lọ trong thư mục lib. Đó là giải pháp hoàn hảo (y)
Sheraz Ahmad Khilji

1
... Trừ khi bạn có kế hoạch chia sẻ thư mục libs đó với các mô-đun khác nhau có các bộ phụ thuộc khác nhau, chẳng hạn như không đặt mã máy chủ với mã máy khách hoặc có nhiều hơn một phiên bản phụ thuộc trong mô-đun phụ khác nhau.
Ajax

Đây là triển khai ưa thích của tôi so với câu trả lời được chấp nhận vì nó nêu rõ vị trí của các tệp. Nó hữu ích khi bạn tham khảo một kho lưu trữ như mavenCentral cho một số thư viện và các bản sao cục bộ cho những người khác. Trong trường hợp đó, có thể có độ trễ trong khi tìm kiếm lớp cho các thư viện cục bộ trong các kho khác.
satbot

1
Lưu ý rằng dir có thể là một đường dẫn tuyệt đối là tốt. Ngoài ra, thay vì 'bao gồm' tôi phải sử dụng 'bao gồm'.
eriel marimon

53

Các công việc sau đây cho tôi:

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

Tham khảo Tài liệu Gradle .


6
câu trả lời tuyệt vời, giải pháp duy nhất hiệu quả với tôi sau khi tìm kiếm trong nhiều ngày
Stardust

Điều quan trọng cần nhớ là phương pháp này nếu bạn không muốn thư viện cụ thể biên dịch với dự án của mình, bạn sẽ phải nhớ xóa nó khỏi thư mục libs ... tôi không thích phương pháp này vì tôi không thấy thư viện nào được thêm vào trừ khi tôi vào thư viện
Jesus Dimrix

1
Điều này khác với câu trả lời của @ Nightwolf như thế nào?
Trenton

2
Không thể tìm thấy phương thức biên dịch () cho các đối số [thư mục 'libs'] trên đối tượng kiểu org.gradle.api.i INTERNal.artifacts.dsl.dependencies.DefaultDependencyHandler
egXcept

33

Bạn có thể thử sử dụng lại kho lưu trữ Maven cục bộ của mình cho Gradle:

  • Cài đặt jar vào kho lưu trữ Maven cục bộ của bạn:

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

  • Kiểm tra xem bạn đã cài đặt jar vào ~/.m2/kho lưu trữ Maven cục bộ chưa

  • Kích hoạt kho lưu trữ Maven cục bộ trong build.gradletệp của bạn :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Bây giờ bạn nên kích hoạt jar để thực hiện trong dự án của bạn

Điều này đã giúp tôi khi tất cả những người khác thất bại!
dùng3

Trong khi điều này hoạt động, đây là một công việc xung quanh và không nên được sử dụng trong môi trường sản xuất / giai đoạn tự động vì điều này thêm một phụ thuộc bổ sung là có một thư mục .m2 (cài đặt maven) trong hệ thống xây dựng.
saurav.varma

29

Câu trả lời được chấp nhận là tốt, tuy nhiên, tôi sẽ cần các cấu hình thư viện khác nhau trong bản dựng Gradle đa dự án của tôi để sử dụng cùng thư viện Java của bên thứ 3.

Thêm ' $ rootProject.projectDir ' vào phần tử đường dẫn ' dir ' trong phần đóng ' allprojects ' của tôi có nghĩa là mỗi dự án con được tham chiếu cùng thư mục ' libs ' và không phải là phiên bản cục bộ cho dự án phụ đó:

//gradle.build snippet
allprojects {
    ...

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

    ...
}

EDIT by Quizzie: đã thay đổi "$ {rootProject.projectDir}" thành "$ rootProject.projectDir" (hoạt động trong phiên bản Gradle mới nhất).


2
nhưng làm thế nào để giới thiệu thư mục libs này trong thư viện build.gradle? Bất kỳ trợ giúp về điều đó.
jeevs

1
Chỉ cần thay đổi "$ {rootProject.projectDir}" thành "$ rootProject.projectDir" để làm cho nó hoạt động trở lại.
Quizzie

4
Hãy chắc chắn sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn vì dấu ngoặc kép sẽ không bị nội suy.
FP tự do

1
Cách tiếp cận này đã giúp tôi.
Shreyash

1
Tất cả các câu trả lời ở đây đã giúp tôi rất nhiều. Mẫu này là mẫu chúng tôi đang sử dụng và giúp mọi người làm việc trong nhóm dễ dàng thả JAR vào thư mục đó khi làm việc trên các nhánh.
Lucy

12

Một cách đơn giản để làm điều này là

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

nó sẽ biên dịch tất cả các tệp .jar trong thư mục libs của bạn trong Ứng dụng.


Là fileTree hoạt động cho tất cả các thư mục con trong thư mục libs. Ví dụ vài lọ bên trong libs / sping / spring.jar, trong trường hợp này có bao gồm cả lò xo .jar không?
mgr

Không, nó không. Về mặt kỹ thuật cũng không nên, vì chúng tôi đang đưa ra 'dir: libs' không phải là thư mục con của libs.
ZygoteInit

Trong trường hợp này, làm thế nào để có được tất cả các thư viện từ các thư mục con với các nhiệm vụ tối thiểu (vì dự án của chúng tôi chứa rất nhiều thư mục con.
mgr

Hey @mallikgm xin lỗi vì trả lời trễ, bạn đã cố gắng thêm ký tự đại diện trong dir con đường như fileTree biên dịch (bao gồm: [ ' .jar'], dir: 'libs ')
ZygoteInit

2
Điều này khác với câu trả lời của @ Nightwolf như thế nào?
Trenton

12

Một giải pháp cho những người sử dụng DSL DSL

Các giải pháp được thêm vào cho đến nay rất tốt cho OP, nhưng không thể sử dụng với DSL DSL mà không cần dịch chúng trước. Đây là một ví dụ về cách tôi đã thêm .JAR cục bộ vào bản dựng của mình bằng cách sử dụng DSL DSL của Kotlin:

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

Hãy nhớ rằng nếu bạn đang sử dụng Windows, dấu gạch chéo ngược của bạn sẽ phải được thoát:

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

Và cũng nên nhớ rằng dấu ngoặc kép phải là dấu ngoặc kép, không phải dấu ngoặc đơn.


Chỉnh sửa cho năm 2020:

Cập nhật Gradle đã phản đối compiletestCompileủng hộ implementationtestImplementation. Vì vậy, khối phụ thuộc ở trên sẽ trông như thế này cho các phiên bản Gradle hiện tại:

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

1
+1 đã làm việc cho tôi! Bạn có biết cách làm tương tự mà không phải tạo tệp jar (trong trường hợp tôi tình cờ sản xuất tệp jar) không?
Kareem Jeiroudi

2
@KareemJeiroudi Tôi có thể hiểu nhầm câu hỏi của bạn, nhưng nếu bạn đang nói về việc biến một mô-đun thành một phụ thuộc của dự án, bạn sẽ làm một cái gì đó như thế này : compile(project(":MyProject")), trong đó "MyProject" được định nghĩa trong settings.gradletệp của bạn với một cái gì đó như include("MyProject").
Jonathan Landrum

8

Tôi không thể nhận được đề xuất ở trên tại https://stackoverflow.com/a/20956456/1019307 để làm việc. Điều này làm việc cho tôi mặc dù. Đối với một tệp secondstring-20030401.jarmà tôi đã lưu trữ trong một libs/thư mục trong thư mục gốc của dự án:

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'

cảm ơn bạn! không biết tại sao nhưng chỉ điều này làm việc cho tôi. đã tạo một thư mục 'libs' ở gốc dự án của tôi, nhét .jar vào đó và sao chép mục nhập 'tên biên dịch' của bạn. Bỏ phần mở rộng .jar quá tất nhiên.
anon58192932

Không, điều này không hoạt động tôi không thể tìm thấy: Miglayout-core :. Tìm kiếm ở các vị trí sau: file: /user/path/to/miglayout-core.jar
Well Smith

công việc này nếu bạn muốn thêm một thư mục tệp làm kho lưu trữ: docs.gradle.org/civerse/userguide/ mẹo
Grubhart

7

Câu hỏi đã được trả lời chi tiết. Tôi vẫn muốn thêm một cái gì đó có vẻ rất đáng ngạc nhiên đối với tôi:

Tác vụ "phụ thuộc lớp" không liệt kê bất kỳ phụ thuộc tệp nào. Mặc dù bạn có thể nghĩ như vậy, vì chúng đã được chỉ định trong khối "phụ thuộc" sau tất cả ..

Vì vậy, đừng dựa vào đầu ra của cái này để kiểm tra xem các tệp lib cục bộ được tham chiếu của bạn có hoạt động chính xác không.


6

Giải pháp hiệu quả với tôi là sử dụng fileTree trong tệp build.gradle. Giữ .jar cần thêm như phụ thuộc trong thư mục libs. Mã cho dưới đây trong khối phụ thuộc trong build.gradle:

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

5

Cách tốt nhất để làm điều đó là thêm phần này vào tệp build.gradle của bạn và nhấn tùy chọn đồng bộ hóa

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

3

Bạn có thể thêm jar làm:

Đối với lớp chỉ cần đặt mã sau đây vào build.gradle:

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

và đối với maven chỉ cần làm theo các bước:

Đối với Intellij: Tệp-> cấu trúc dự án-> mô-đun-> tab phụ thuộc-> nhấp vào + dấu-> jar và phụ thuộc-> chọn lọ bạn muốn nhập-> ok-> áp dụng (nếu hiển thị) -> ok

Hãy nhớ rằng nếu bạn có bất kỳ java.lang.NoClassDefFoundError: Could not initialize classngoại lệ nào trong thời gian chạy, điều này có nghĩa là các phụ thuộc trong jar không được cài đặt mà bạn phải thêm tất cả các phụ thuộc trong dự án mẹ.


0

Tệp Goto -> Cấu trúc dự án -> Mô-đun -> ứng dụng -> Tab phụ thuộc -> Nhấp vào + (nút) -> Chọn tệp phụ thuộc -> Chọn tệp jar trong thư mục lib

Các bước này sẽ tự động thêm phụ thuộc của bạn vào gralde

Rất đơn giản


3
Đó có phải là đường dẫn qua một số menu Java IDE không? Có lẽ là ý tưởng?
Utgarda

1
Vâng, nó trông giống như một cái gì đó cho IntelliJ IDEA, và tôi không nghĩ rằng nó sẽ hoạt động. Hoặc, có vẻ như nó đang hoạt động cho đến khi thay đổi được thiết lập Gradle dẫn đến việc "đồng bộ hóa" được thực hiện và đồng bộ hóa là một chiều từ Gradle sang cài đặt IntelliJ. Nó không đồng bộ hóa theo cách khác - ít nhất là tôi không nghĩ vậy.
RenniePet

1
Nếu bạn đã chọn nhập tự động, .JAR được nhập thủ công sẽ bị xóa trong lần thay đổi tiếp theo build.gradle.
Jonathan Landrum

-1

Hãy cẩn thận nếu bạn đang sử dụng tích hợp liên tục, bạn phải thêm các thư viện của mình vào cùng một đường dẫn trên máy chủ xây dựng của bạn.

Vì lý do này, tôi muốn thêm jar vào kho lưu trữ cục bộ và tất nhiên, làm tương tự trên máy chủ xây dựng.


-3

Cách khác:

Thêm thư viện trong chế độ xem cây. Nhấp chuột phải vào cái này Chọn menu "Thêm dưới dạng thư viện". Một hộp thoại xuất hiện, cho phép bạn chọn mô-đun. OK và nó đã hoàn thành.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.