เพิ่มทรัพยากรไฟล์กำหนดค่าลงใน jar ของคุณโดยใช้ gradle


91

ฉันจะเพิ่มไฟล์กำหนดค่าหรือทรัพยากรอื่น ๆ ลงใน jar ของฉันโดยใช้ gradle ได้อย่างไร

โครงสร้างโครงการของฉัน:

src / main / java / com / perseus / .. - แพ็คเกจ Java (ไฟล์ต้นทาง)

src / main / java / config / *. xml - ไฟล์กำหนดค่า Spring

โครงสร้างโถที่คาดหวัง:

com / perseus / .. - แพ็คเกจ Java (ไฟล์คลาส)

config / *. xml - ไฟล์กำหนดค่า Spring

คำตอบ:


82

ฉันเจอโพสต์นี้ค้นหาวิธีเพิ่มไดเรกทอรีพิเศษสำหรับทรัพยากร ฉันพบวิธีแก้ปัญหาที่อาจเป็นประโยชน์กับใครบางคน นี่คือการกำหนดค่าสุดท้ายของฉันที่จะได้รับสิ่งนั้น:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}

5
นี่เป็นวิธีแก้ปัญหาที่ง่ายกว่าคำตอบที่ยอมรับมาก
Stewart

70

ย้าย config ไฟล์จากไปsrc/main/javasrc/main/resources


1
ได้ผลสำหรับฉันดูเหมือนเป็นวิธีที่ง่ายและ "ถูกต้องที่สุด" ในการบรรลุเป้าหมายนี้
EM-Creations

คำตอบนี้แนะนำวิธีแก้ปัญหามากกว่าวิธีแก้ปัญหาและ Gradle ให้วิธีแก้ปัญหา
ลูกกบแย่

@TerribleTadpole นี่คือทางออกที่ถูกต้อง อื่น ๆ ทั้งหมดเป็นวิธีแก้ปัญหา
jannis

64

ขอบคุณนะฉันกำลังย้ายโครงการที่มีอยู่ไปยัง Gradle และไม่ชอบความคิดที่จะเปลี่ยนโครงสร้างโครงการมากขนาดนั้น

ฉันคิดออกแล้วคิดว่าข้อมูลนี้อาจเป็นประโยชน์สำหรับผู้เริ่มต้น

นี่คือตัวอย่างงานจาก 'build.gradle' ของฉัน:

version = '1.0.0'

jar {
   baseName = 'analytics'
   from('src/main/java') {
      include 'config/**/*.xml'
   }

   manifest {
       attributes 'Implementation-Title': 'Analytics Library', 'Implementation-Version': version
   }
}

35
การกำหนดค่าชุดแหล่งที่มาใหม่จะแม่นยำกว่า บางอย่างเช่นsourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser

1
ขอบคุณ @PeterNiederwieser !! พยายามเอาไฟล์ log4j.xml ของฉันไปรวมไว้ในขวดปฏิบัติการของฉันที่ฉันสร้างโดยใช้เงา ฉันเองก็กำลังจัดการกับโปรเจ็กต์ที่เก่ากว่าและไม่สามารถเปลี่ยนโครงสร้างไดเร็กทอรีได้ทันที คำแนะนำของคุณคือสิ่งที่ฉันต้องการ !! : D
Piko

@PeterNiederwieser - ฉันสังเกตเห็นในเอกสารของปลั๊กอิน Java ว่าทรัพยากรถูกกำหนดให้ยกเว้น * .java แล้ว "มีทรัพยากรเท่านั้นและไม่รวมไฟล์. java ใด ๆ ที่พบในไดเร็กทอรีแหล่งทรัพยากร"
Joe Bowbeer

26

โดยค่าเริ่มต้นไฟล์ใด ๆ ที่คุณเพิ่มเข้าไปsrc/main/resourcesจะรวมอยู่ใน jar

sourceSetsหากคุณจำเป็นต้องเปลี่ยนพฤติกรรมที่เหตุผลใดที่คุณสามารถทำได้โดยการกำหนดค่า

เอกสารส่วนนี้มีรายละเอียดทั้งหมด


4
คุณจะทราบหรือไม่ว่าเหตุใดจึงรวมเฉพาะเนื้อหา.../resources/แทนที่จะเป็นไดเร็กทอรีทรัพยากรที่มีเนื้อหา
sargas

@sargas คุณควรจะเริ่มคำถามใหม่ที่คุณสามารถรวมบริบททั้งหมดได้อย่างง่ายดาย ยากที่จะได้รับข้อมูลมากในส่วนความคิดเห็น :(
ภูมิศาสตร์และ

18

ฉันพบปัญหาเดียวกัน ฉันมีไฟล์ PNG ในแพ็คเกจ Java และไม่ได้ส่งออกใน JAR สุดท้ายพร้อมกับแหล่งที่มาซึ่งทำให้แอปหยุดทำงานเมื่อเริ่มต้น (ไม่พบไฟล์)

คำตอบข้างต้นไม่สามารถแก้ปัญหาของฉันได้ แต่ฉันพบวิธีแก้ปัญหาในฟอรัม Gradle ฉันเพิ่มสิ่งต่อไปนี้ในbuild.gradleไฟล์ของฉัน:

sourceSets.main.resources.srcDirs = [ "src/" ]
sourceSets.main.resources.includes = [ "**/*.png" ]

มันบอกให้ Gradle ค้นหาทรัพยากรในsrcโฟลเดอร์และขอให้รวมเฉพาะไฟล์ PNG

แก้ไข:ระวังว่าหากคุณใช้ Eclipse สิ่งนี้จะทำลายการกำหนดค่าการรันของคุณและคุณจะได้รับmain class not foundข้อผิดพลาดเมื่อพยายามเรียกใช้โปรแกรมของคุณ ในการแก้ไขปัญหาว่าทางออกเดียวที่ฉันได้พบคือการย้ายภาพ (s) เพื่อไดเรกทอรีอื่นres/เช่นและจะตั้งเป็นแทนsrcDirssrc/


2
ฉันใช้ตัว+=ดำเนินการเพื่อเพิ่ม dirs ของฉันไปยัง dirs ที่มีอยู่: เช่นsourceSets.main.resources.srcDirs += [ "src/main/java" ]
TmTron

3

โปรดทราบว่าเส้นทางภายใต้ src / main / resources ต้องตรงกับเส้นทางแพ็กเกจของไฟล์. class ของคุณที่ต้องการเข้าถึงทรัพยากร ดูคำตอบของฉันที่นี่

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