2015-10-08 21 views
6

Tôi có một dự án cha mẹ đơn giản với các mô đun/ứng dụng bên trong nó. Công cụ xây dựng của tôi là sự lựa chọn tốt. Phụ huynh build.gradle được định nghĩa bên dưới.Cách lấy thuộc tính phiên bản từ một bản xây dựng gradle được bao gồm trong ứng dụng Swing runtime

apply plugin: 'groovy' 
dependencies { 
    compile gradleApi() 
    compile localGroovy() 
} 


allprojects { 
    repositories { 
     mavenCentral() 
    } 

    version "0.1.0-SNAPSHOT" 
} 

Điều tôi muốn làm là sử dụng thuộc tính phiên bản (0.1.0-SNAPSHOT) trong ứng dụng xoay của tôi. Cụ thể, tôi muốn nó hiển thị trong thanh tiêu đề của JFrame chính. Tôi mong đợi để có thể làm một cái gì đó như this.setTitle("My Application - v." + ???.version);

Ứng dụng này là một dự án java đơn giản, nhưng tôi không phản đối việc thêm hỗ trợ groovy nó sẽ giúp ích.

+1

một số [ '.properties'] (http://crunchify.com/java-properties-file-how-to-read-config-properties-values-in-java/) tệp nhận phiên bản được đặt động (ví dụ: 1-8 trong https: //www.safaribooksonline. com/library/view/gradle-beyond-the/9781449373801/ch01.html)? – zapl

Trả lời

17

Tôi thích tạo tệp thuộc tính trong khi tạo. Dưới đây là một cách để làm điều đó từ Gradle trực tiếp:

task createProperties(dependsOn: processResources) { 
    doLast { 
    new File("$buildDir/resources/main/version.properties").withWriter { w -> 
     Properties p = new Properties() 
     p['version'] = project.version.toString() 
     p.store w, null 
    } 
    } 
} 

classes { 
    dependsOn createProperties 
} 
+0

Tôi thích giải pháp này. Nhưng thiết lập của tôi có một lỗi trên 'project.buildTimestamp' ... và nhìn vào tài liệu Gradle Javadoc và DSL hiện tại, tôi không thấy dấu hiệu của bất kỳ phương thức nào như vậy cho' Project' hoặc bất kỳ lớp nào khác. Phiên bản là 2.14, có lẽ đó là lý do. Không có ý tưởng làm thế nào để làm một dấu thời gian như vậy bây giờ, phải không? Chăm sóc để cập nhật câu trả lời của bạn? –

+0

Rõ ràng 'project.buildTimestamp' là một phần của trí tưởng tượng của tôi.Bạn vẫn có thể thêm các thuộc tính khác dựa trên nhu cầu của bạn, nhưng chúng không liên quan đến ví dụ này, vì vậy tôi đã xóa nó khỏi câu trả lời. –

+0

Không có gì sai với ước muốn thế giới tốt hơn nó ;-). Nhưng cảm ơn vì đã loại bỏ một nguồn gây nhầm lẫn tiềm ẩn! –

6

Bạn luôn có thể sử dụng sức mạnh vũ phu như ai đó đã đề xuất và tạo tệp thuộc tính trong khi tạo. Nhiều câu trả lời tao nhã, mà chỉ hoạt động một phần sẽ được sử dụng

getClass().getPackage().getImplementationVersion() 

Vấn đề là điều này sẽ chỉ làm việc nếu bạn chạy ứng dụng của bạn từ jar tạo - nếu bạn chạy nó trực tiếp từ IDE/classes mở rộng, getPackage trên sẽ trở lại vô giá trị. Nó là đủ tốt cho nhiều trường hợp - chỉ cần hiển thị 'PHÁT TRIỂN' nếu bạn chạy từ IDE (nhận gói null) và sẽ làm việc cho các triển khai thực tế của khách hàng.

+0

Cảm ơn ... Có, trên thực tế tôi đề nghị bạn cần sử dụng máy của bạn để triển khai và giải pháp của Craig Trader trong khi kiểm tra ... vì lý do nào đó đường dẫn đến version.properties trong câu trả lời của anh ấy phải là ".../resources/* ** TEST ***/version.properties ". Không cần phải làm lộn xộn cái bình được triển khai của bạn với tập tin này. –

6

Ý tưởng tốt hơn là giữ phiên bản dự án trong tệp gradle.properties. Tất cả các thuộc tính từ tệp này sẽ được tải tự động và có thể được sử dụng trong tập lệnh build.gradle.

Sau đó, nếu bạn cần phiên bản trong ứng dụng xoay, hãy thêm một tệp version.properties dưới src/main/resources thư mục và lọc tệp này trong quá trình xây dựng ứng dụng, here là bài đăng cho biết cách thực hiện.

version.properties sẽ được bao gồm trong bình cuối cùng, do đó có thể đọc và thông qua ClassLoader và thuộc tính từ tệp này có thể được hiển thị trong ứng dụng.

+0

Lọc tài nguyên là giải pháp tuyệt vời. Nó tách mối quan tâm cho phép công cụ xây dựng cung cấp chi tiết mà nó biết. xem [tài liệu gradle] (https://guides.gradle.org/migrating-from-maven/#resource_filtering) '' 'processResources { mở rộng (phiên bản: phiên bản, buildNumber: currentBuildNumber) }' '' – KingJahfy

0

đơn giản và giải pháp cập nhật của @Craig Trader (sẵn sàng cho Gradle 4,0/5,0)

task createProperties { 
    doLast { 
     def version = project.version.toString() 
     def file = new File("$buildDir/resources/main/version.txt") 
     file.write(version) 
    } 
} 

war { 
    dependsOn createProperties 
} 
+0

Viết một tệp văn bản thuần túy đơn giản hơn việc viết tệp thuộc tính, nhưng không hữu ích về lâu dài, IMHO. –

Các vấn đề liên quan