วิธีเพิ่มการเพิ่มขึ้นของ. jar ในไฟล์ build.gradle


607

ดังนั้นฉันได้ลองเพิ่มการขึ้นอยู่กับไฟล์. jar ในไฟล์ build.gradle ของฉัน:

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 ลงในโฟลเดอร์ referencedL ไลบรารีที่นี่: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibrary

แต่ปัญหาคือเมื่อฉันเรียกใช้คำสั่ง: gradle build บนบรรทัดคำสั่งฉันได้รับข้อผิดพลาดต่อไปนี้:

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

นี่คือ repo ทั้งหมดของฉัน: 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
นี้คำถามกองมากเกินในที่สุดก็ทำให้ผมมีคำตอบที่ฉันต้องการ
craned

คำตอบ:


456

หากคุณจำเป็นต้องใช้. jar จากไดเรกทอรีท้องถิ่น

เพิ่มถัดจากโมดูล gradle ของคุณ (ไม่ใช่ไฟล์ gradle ของแอป):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

อย่างไรก็ตามการเป็น. jar มาตรฐานในที่เก็บ maven จริงทำไมคุณไม่ลองดูล่ะ

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

4
ฉันมาเพื่อค้นหาสิ่งนี้ แต่ฉันพบว่าที่เก็บในเครื่องของฉันไม่สามารถแก้ไขการพึ่งพาสกรรมกริยาได้ (Gradle 2.7, ตัวอย่าง POM คือ com.mojang: authlib: 1.5.21 ตามที่สกัดโดย minecraftforge.net)
Karl the Pagan

1
หากคุณมีไฟล์ jar โลคัลในหลายไดเร็กทอรีคุณต้องเพิ่มไฟล์ทั้งหมดลงใน flatDir ตัวอย่าง: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal

9
ฉันกำลังมีgradle.buildไฟล์ - "ไฟล์ gradle ของแอป" และ "โมดูล gradle" คืออะไร
Lealo

2
มีโอกาสที่ใครบางคนจะอัปเดตคำตอบพร้อมลิงก์ไปยังส่วนเอกสารอย่างเป็นทางการของ Gradle ที่อธิบายคุณสมบัติเหล่านี้?
misanthrope

2
implementation(":gson:2.2.4")น่าจะเป็นวิธีที่จะทำ
Eng.Fouad

697

ตามเอกสารคู่มือให้ใช้พา ธ สัมพัทธ์สำหรับการพึ่งพา jar ในเครื่องดังนี้:

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

8
@Gubatron ตอนนี้ทำเป็นเอกสารแล้ว: gradle.org/docs/current/userguide/…
David Moles

7
เพียงแค่ต้องการเพิ่มสิ่งนั้นสำหรับผู้ที่ใช้เส้นทางสัมพัทธ์กับ jar ของเรา: dependencies {ไฟล์คอมไพล์ ("libs / something_local.jar"} (เช่น double-quote ไม่ใช่ single-quotes) เป็นสิ่งจำเป็นโดย Groovy ในการประเมินเส้นทาง คำพูดจะถูกนำมาอย่างแท้จริงใน Groovy
specialk1st

ดังนั้นฉันกำลังใช้สิ่งเดียวกันและฉันได้รับข้อผิดพลาดในการรวบรวม (ดูเหมือนจะไม่พบขวดที่นั่น) หากฉันให้เส้นทางที่แน่นอนมันใช้งานได้ดี
RV_Dev

ฉันต้องการโซลูชันนี้ แต่ฉันพบว่าหากไฟล์นั้นไม่มีอยู่จะไม่มีข้อผิดพลาดเกิดขึ้นโดย Gradle ฉันได้พบสิ่งนี้เป็นการส่วนตัวแล้วโปรดดูคำถามนี้เพื่อดูรายละเอียด: stackoverflow.com/q/42527631/4851565
entpnerd

ฉันได้รับข้อผิดพลาดที่คล้ายกันแม้หลังจากใช้โซลูชันนี้ ความผิดพลาดฉันใส่โฟลเดอร์ libs ในแอพที่ไม่ได้อยู่ในระดับเดียวกับแอพ
Rishabh Dugar

314

คุณสามารถทำสิ่งนี้ซึ่งจะรวม JARs ทั้งหมดในที่เก็บภายในเครื่อง วิธีนี้คุณไม่ต้องระบุทุกครั้ง

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

3
ใช้สำหรับรวบรวม jars ทั้งหมดในไดเรกทอรี lib มันเป็นโซลูชั่นที่สมบูรณ์แบบ (y)
Sheraz Ahmad Khilji

1
... เว้นแต่คุณวางแผนที่จะแชร์ไดเรกทอรี libs ที่มีโมดูลต่าง ๆ ที่มีชุดการพึ่งพาที่แตกต่างกันเช่นไม่ใส่รหัสเซิร์ฟเวอร์ด้วยรหัสลูกค้าหรือมีการพึ่งพามากกว่าหนึ่งรุ่นในโมดูลย่อยที่แตกต่างกัน
Ajax

นี่คือการใช้งานที่ฉันต้องการมากกว่าคำตอบที่ยอมรับเพราะระบุตำแหน่งของไฟล์อย่างชัดเจน มันมีประโยชน์สำหรับเมื่อคุณอ้างถึงที่เก็บเช่น mavenCentral สำหรับห้องสมุดบางแห่งและสำเนาภายในสำหรับคนอื่น ๆ ในกรณีนี้อาจมีความล่าช้าในขณะที่ไล่ระดับการค้นหาห้องสมุดท้องถิ่นในที่เก็บอื่น ๆ
satbot

1
โปรดทราบว่า dir สามารถเป็นเส้นทางที่แน่นอนได้เช่นกัน นอกจากนี้แทนที่จะใช้ 'รวม' ฉันต้องใช้ 'รวม'
eriel marimon

53

งานต่อไปนี้สำหรับฉัน:

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

อ้างถึงเอกสาร Gradle


6
คำตอบที่ยอดเยี่ยมทางออกเดียวที่ทำงานกับฉันหลังจากค้นหาวัน
สตาร์

สิ่งสำคัญที่ต้องจำไว้ว่าเป็นวิธีการนี้หากคุณไม่ต้องการให้ห้องสมุดเฉพาะรวบรวมโครงการของคุณคุณจะต้องจำไว้ว่าต้องลบมันออกจากโฟลเดอร์ libs ... ฉันไม่ชอบวิธีนี้เพราะฉันไม่เห็นว่าห้องสมุดใดที่ฉัน เพิ่มเว้นแต่ฉันจะเข้าไปในห้องสมุด
Jesus Dimrix

1
สิ่งนี้แตกต่างจากคำตอบของ @ Nightwolf อย่างไร
Trenton

2
ไม่สามารถหาวิธีการคอมไพล์ () สำหรับข้อโต้แย้ง [ไดเรกทอรี 'libs'] บนวัตถุประเภท org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
ieXcept

33

คุณสามารถลองใช้ที่เก็บ Maven ในพื้นที่ของคุณซ้ำสำหรับ Gradle:

  • ติดตั้ง jar ลงในที่เก็บ Maven ท้องถิ่นของคุณ:

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

  • ตรวจสอบว่าคุณติดตั้ง jar ไว้ในที่~/.m2/เก็บ Maven ในพื้นที่ ของคุณ

  • เปิดใช้พื้นที่เก็บข้อมูล Maven ท้องถิ่นของคุณในbuild.gradleไฟล์ของคุณ:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • ตอนนี้คุณควรเปิดใช้งาน jar เพื่อนำไปใช้ในโครงการของคุณ

อันนี้ช่วยฉันได้เมื่อสิ่งอื่นล้มเหลว!
User3

ในขณะที่ใช้งานได้นี่เป็นวิธีแก้ปัญหาและไม่ควรใช้ในสภาพแวดล้อมการผลิต / เวทีอัตโนมัติเนื่องจากเป็นการเพิ่มการพึ่งพาเพิ่มเติมของการมีโฟลเดอร์. m2 (การติดตั้ง maven) ในระบบบิลด์
saurav.varma

29

คำตอบที่ได้รับการยอมรับเป็นสิ่งที่ดี แต่ฉันจะต้องมีการกำหนดค่าห้องสมุดต่าง ๆ ในการสร้าง Gradle หลายโครงการของฉันเพื่อใช้ห้องสมุด Java บุคคลที่สามเดียวกัน

การเพิ่ม ' $ rootProject.projectDir ' ให้กับองค์ประกอบพา ธ ' dir ' ภายในการปิด ' allprojects ' ของฉันหมายถึงแต่ละโครงการย่อยที่อ้างอิงไดเรกทอรี ' 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
แต่จะอ้างถึงโฟลเดอร์ libs นี้ในไลบรารี build.gradle ได้อย่างไร ความช่วยเหลือใด ๆ เกี่ยวกับที่
jeevs

1
เพียงแค่เปลี่ยน "$ {rootProject.projectDir}" เป็น "$ rootProject.projectDir" เพื่อให้มันทำงานได้อีกครั้ง
Quizzie

4
ตรวจสอบให้แน่ใจว่าใช้เครื่องหมายคำพูดคู่แทนที่จะเป็นเครื่องหมายคำพูดเดี่ยวเพราะเครื่องหมายหลังจะไม่ถูกแก้ไข
FP ได้อย่างอิสระ

1
วิธีนี้ช่วยฉันได้
Shreyash

1
คำตอบทั้งหมดที่นี่ช่วยฉันได้มาก รูปแบบนี้เป็นรูปแบบที่เราใช้และทำให้ผู้ที่ทำงานเป็นทีมง่าย ๆ เพียงแค่วาง JAR ลงในไดเรกทอรีนั้นเมื่อทำงานกับสาขา
ลูซี่

12

วิธีง่ายๆในการทำเช่นนี้คือ

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

มันจะรวบรวมไฟล์. jar ทั้งหมดในไดเรกทอรี libs ของคุณในแอพ


Is fileTree ใช้งานได้กับไดเรกทอรีย่อยทั้งหมดในโฟลเดอร์ libs ตัวอย่างขวดสองสามตัวที่อยู่ใน libs / sping / spring.jar ในกรณีนี้มันมี spring .jar ด้วยหรือไม่
mgr

ไม่เลย ในทางเทคนิคแล้วมันก็ไม่ควรเช่นกันเพราะเราให้ 'dir: libs' ไม่ใช่ไดเรกทอรีย่อยของ libs
ZygoteInit

ในกรณีนี้วิธีรับไลบรารีทั้งหมดจากไดเรกทอรีย่อยที่มีงานขั้นต่ำ (เพราะโครงการของเรามีไดเรกทอรีย่อยมากมาย
mgr

สวัสดี @mallikgm ขอโทษที่ตอบช้าคุณลองเพิ่ม wildcard ใน dir path เช่น compile fileTree (รวมถึง: [' .jar'], dir: 'libs ')
ZygoteInit

2
สิ่งนี้แตกต่างจากคำตอบของ @ Nightwolf อย่างไร
เทรนตัน

11

วิธีแก้ปัญหาสำหรับผู้ที่ใช้ Kotlin DSL

โซลูชันที่เพิ่มเข้ามานั้นยอดเยี่ยมสำหรับ OP แต่ไม่สามารถใช้กับ Kotlin DSL โดยไม่ต้องแปลก่อน นี่คือตัวอย่างของวิธีการที่ฉันเพิ่มท้องถิ่น. JAR ไปยังงานสร้างของฉันโดยใช้ Kotlin DSL:

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)
Kareem Jeiroudi

2
@KareemJeiroudi ผมอาจจะเข้าใจผิดคำถามของคุณ แต่ถ้าคุณมีการพูดคุยเกี่ยวกับการทำโมดูลการพึ่งพาของโครงการคุณจะทำอะไรเช่นนี้compile(project(":MyProject"))ที่ "MyProject" ถูกกำหนดไว้ในของคุณไฟล์กับสิ่งที่ต้องการsettings.gradle include("MyProject")
Jonathan Landrum

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

ไม่นี่ไม่ได้ผลกับฉันไม่พบ: miglayout-core: ค้นหาในสถานที่ดังต่อไปนี้: ไฟล์: /user/path/to/miglayout-core.jar
Well Smith

ใช้งานได้ถ้าคุณต้องการเพิ่มไดเรกทอรีไฟล์เป็นที่เก็บ: docs.gradle.org/current/userguide/ …
Grubhart

7

คำถามนี้ได้รับคำตอบอย่างละเอียดแล้ว ฉันยังต้องการเพิ่มสิ่งที่น่าแปลกใจสำหรับฉัน:

งาน "gradle dependencies" ไม่แสดงรายการการขึ้นต่อกันของไฟล์ใด ๆ แม้ว่าคุณอาจจะคิดอย่างนั้นตามที่ระบุไว้ในบล็อก "การอ้างอิง" หลังจากทั้งหมด ..

ดังนั้นอย่าพึ่งพาผลลัพธ์ของสิ่งนี้เพื่อตรวจสอบว่าไฟล์ lib ในเครื่องที่คุณอ้างถึงทำงานอย่างถูกต้องหรือไม่


6

วิธีแก้ปัญหาสำหรับฉันคือการใช้ fileTree ในไฟล์ build.gradle เก็บ. jar ซึ่งต้องการเพิ่มเป็นการอ้างอิงในโฟลเดอร์ libs ให้รหัสด้านล่างในบล็อกพึ่งพาใน build.gradle:

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

5

วิธีที่ดีที่สุดที่จะทำคือการเพิ่มสิ่งนี้ในไฟล์ build.gradle ของคุณและกดตัวเลือกการซิงค์

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

3

คุณสามารถเพิ่มโถทำ:

สำหรับ gradle เพียงแค่ใส่รหัสต่อไปนี้ในbuild.gradle:

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

และสำหรับ Maven เพียงทำตามขั้นตอน:

สำหรับ Intellij: File-> project structure-> modules-> แท็บการพึ่งพา>> คลิกที่ + sign-> jar and dependency-> เลือกไหที่คุณต้องการอิมพอร์ต -> ok-> Apply (ถ้ามองเห็นได้) -> ok

โปรดจำไว้ว่าถ้าคุณได้รับjava.lang.NoClassDefFoundError: Could not initialize classข้อยกเว้นใด ๆในขณะทำงานนั่นหมายความว่าการพึ่งพาใน jar ไม่ได้ติดตั้งไว้เพื่อที่คุณจะต้องเพิ่มการพึ่งพาทั้งหมดในโครงการหลัก


0

ไปที่ไฟล์ -> โครงสร้างโครงการ -> โมดูล -> แอพ -> แท็บอ้างอิง -> คลิกที่ + (ปุ่ม) -> เลือกการพึ่งพาไฟล์ -> เลือกไฟล์ในโฟลเดอร์ lib

ขั้นตอนนี้จะเพิ่มการพึ่งพาของคุณไปยัง gralde โดยอัตโนมัติ

ง่ายมาก


3
นั่นคือเส้นทางผ่านเมนู Java IDE บางอย่างใช่ไหม น่าจะเป็นความคิด?
Utgarda

1
ใช่นั่นดูเหมือนกับ IntelliJ IDEA และฉันไม่คิดว่ามันจะใช้ได้ หรือดูเหมือนว่าจะทำงานจนกว่าจะมีการเปลี่ยนแปลงการตั้งค่า Gradle ซึ่งจะส่งผลให้เกิด "การซิงโครไนซ์" และการซิงโครไนซ์เป็นทางเดียวจาก Gradle ไปเป็นการตั้งค่า IntelliJ มันไม่ได้ซิงโครไนซ์ด้วยวิธีอื่น - อย่างน้อยฉันก็ไม่คิดอย่างนั้น
RenniePet

1
build.gradleหากคุณมีการนำเข้าโดยอัตโนมัติเลือกขวดที่นำเข้าด้วยตนเองจะถูกลบออกในการเปลี่ยนแปลงที่อยู่ถัดจาก
Jonathan Landrum

-1

ระวังถ้าคุณใช้การรวมอย่างต่อเนื่องคุณต้องเพิ่มไลบรารีของคุณในเส้นทางเดียวกันบนเซิร์ฟเวอร์การสร้างของคุณ

ด้วยเหตุนี้ฉันจึงควรเพิ่ม jar ลงในที่เก็บข้อมูลในเครื่องและแน่นอนทำแบบเดียวกันบนบิลด์เซิร์ฟเวอร์


-3

วิธีอื่น:

เพิ่มไลบรารีในมุมมองแบบต้นไม้ คลิกขวาที่อันนี้ เลือกเมนู "เพิ่มเป็นห้องสมุด" กล่องโต้ตอบปรากฏขึ้นให้คุณเลือกโมดูล ตกลงและเสร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.