Thêm tài nguyên, cấu hình tệp vào jar của bạn bằng cách sử dụng gradle


91

Làm cách nào để thêm tệp cấu hình hoặc bất kỳ tài nguyên nào khác vào jar của tôi bằng cách sử dụng gradle?

Cấu trúc dự án của tôi:

src / main / java / com / perseus / .. --- Các gói Java (tệp nguồn)

src / main / java / config / *. xml --- Các tệp cấu hình mùa xuân

Cấu trúc bình dự kiến:

com / perseus / .. --- Các gói Java (tệp lớp)

config / *. xml --- Các tệp cấu hình mùa xuân

Câu trả lời:


81

Tôi đã xem qua bài đăng này khi tìm kiếm cách thêm một thư mục bổ sung cho các tài nguyên. Tôi đã tìm thấy một giải pháp có thể hữu ích cho ai đó. Đây là cấu hình cuối cùng của tôi để có được điều đó:

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

5
Đây là một giải pháp đơn giản hơn nhiều so với câu trả lời chấp nhận
Stewart

70

Di chuyển các tệp cấu hình từ src/main/javasang src/main/resources.


1
Đối với tôi, có vẻ như là cách dễ nhất và "đúng đắn nhất" để đạt được điều này.
EM-Creations

Câu trả lời này gợi ý một giải pháp xoay quanh thay vì một giải pháp và Gradle cung cấp một giải pháp.
Terrible Tadpole

@TerribleTadpole đây là giải pháp chính xác. Tất cả những cách khác là cách giải quyết.
jannis

63

Cảm ơn các bạn, tôi đang chuyển một dự án hiện có sang Gradle và không thích ý tưởng thay đổi cấu trúc dự án nhiều như vậy.

Tôi đã tìm ra nó, nghĩ rằng thông tin này có thể hữu ích cho người mới bắt đầu.

Đây là một nhiệm vụ mẫu từ 'build.gradle' của tôi:

version = '1.0.0'

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

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

34
Cấu hình lại bộ nguồn sẽ chính xác hơn. Một cái gì đó giống như sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser

1
Cảm ơn @PeterNiederwieser !! Bạn đang cố gắng đưa tệp log4j.xml của mình vào jar thực thi mà tôi đang xây dựng bằng cách sử dụng shadow. Tôi cũng đang xử lý một dự án cũ hơn và không thể dễ dàng thay đổi cấu trúc thư mục. Đề xuất của bạn là chính xác những gì tôi cần !! : D
Piko

@PeterNiederwieser - Tôi nhận thấy trong tài liệu plugin Java rằng các tài nguyên đã được xác định để loại trừ * .java. "Chỉ chứa tài nguyên và loại trừ bất kỳ tệp .java nào được tìm thấy trong các thư mục nguồn tài nguyên."
Joe Bowbeer

25

Theo mặc định, bất kỳ tệp nào bạn thêm vào src/main/resourcessẽ được bao gồm trong jar.

Nếu bạn cần thay đổi hành vi đó vì bất kỳ lý do gì, bạn có thể làm như vậy bằng cách cấu hình sourceSets.

Phần này của tài liệu có tất cả các chi tiết


4
Bạn có biết tại sao chỉ nội dung của .../resources/được bao gồm thay vì thư mục tài nguyên nội dung không?
sargas

@sargas Có lẽ bạn nên bắt đầu một câu hỏi mới mà bạn có thể dễ dàng đưa vào tất cả các ngữ cảnh. Thật khó để có được nhiều thông tin trong phần bình luận :(
geoand

18

Tôi gặp phải vấn đề tương tự. Tôi có một tệp PNG trong một gói Java và nó không được xuất trong JAR cuối cùng cùng với các nguồn, điều này khiến ứng dụng gặp sự cố khi khởi động (không tìm thấy tệp).

Không có câu trả lời nào ở trên giải quyết được vấn đề của tôi nhưng tôi đã tìm thấy giải pháp trên các diễn đàn Gradle. Tôi đã thêm phần sau vào build.gradletệp của mình :

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

Nó yêu cầu Gradle tìm kiếm tài nguyên trong srcthư mục và yêu cầu nó chỉ bao gồm các tệp PNG.

CHỈNH SỬA: Hãy lưu ý rằng nếu bạn đang sử dụng Eclipse, điều này sẽ phá vỡ cấu hình chạy của bạn và bạn sẽ gặp main class not foundlỗi khi cố gắng chạy chương trình của mình. Để khắc phục điều đó, giải pháp duy nhất tôi đã tìm thấy là di chuyển (các) hình ảnh sang một thư mục khác res/, và đặt nó làm thư mục srcDirsthay thế src/.


2
Tôi đã sử dụng +=toán tử để thêm các dirs của mình vào các dirs hiện có: ví dụsourceSets.main.resources.srcDirs += [ "src/main/java" ]
TmTron 12/01

3

Lưu ý rằng đường dẫn trong src / main / resources phải khớp với đường dẫn gói của các tệp .class của bạn muốn truy cập tài nguyên. Xem câu trả lời của tôi tại đây .

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.