2013-06-24 44 views
7

Tôi đang sử dụng Gradle để tạo bình chứa tệp xml trong META-INF. Tệp này có một hàng nhưLàm thế nào để mở rộng tài sản tham khảo trong tài nguyên jar?

<property name="databasePlatform" value="${sqlDialect}" /> 

để cho phép các cơ sở dữ liệu SQL khác nhau cho các môi trường khác nhau. Tôi muốn nói với gradle để mở rộng ${sqlDialect} từ các thuộc tính của dự án.

Tôi cố gắng này:

jar { 
    expand project.properties 
} 

nhưng nó không thành công với một GroovyRuntimeException mà dường như với tôi như nhiệm vụ Jar nỗ lực để mở rộng tài sản trong .class file là tốt. Vì vậy, sau đó tôi đã thử

jar { 
    from(sourceSets.main.resources) { 
     expand project.properties 
    } 
} 

mà không ném ngoại lệ trên, mà thay vào đó là kết quả tất cả các tài nguyên được sao chép hai lần - một lần với mở rộng tài sản và một lần không có. Tôi quản lý để làm việc xung quanh này với

jar { 
    eachFile { 
     if(it.relativePath.segments[0] in ['META-INF']) { 
      expand project.properties 
     } 
    } 
} 

mà làm những gì tôi muốn, vì trong trường hợp sử dụng của tôi, tôi chỉ cần mở rộng thuộc tính của tập tin trong thư mục META-INF. Nhưng điều này cảm thấy như một hack khá xấu xí, là có một cách tốt hơn để làm điều này?

Trả lời

10

Tôi tình cờ gặp this post trong một chuỗi về một vấn đề khác có liên quan chặt chẽ. Hóa ra bạn muốn cấu hình các nhiệm vụ processResources, không phải là nhiệm vụ jar:

processResources { 
    expand project.properties 
} 

Đối với một số lý do, tuy nhiên, tôi đã phải clean một lần trước khi Gradle nhận thấy sự thay đổi.

0

Tôi đã thực hiện lần thử đầu tiên của bạn và tạo một dự án thử nghiệm. Tôi đặt một tập tin pom từ một plugin jenkins trong ./src/main/resources/META-INF/. Tôi giả sử nó là một ví dụ xml đủ tốt. Tôi thay thế các dòng artifactId để trông giống như sau:

<artifactId>${artifactId}</artifactId> 

build.gradle của tôi:

apply plugin: 'java' 

jar { 
    expand project.properties 
} 

Khi tôi chạy gradle jar lần đầu tiên nó phát nổ vì tôi quên để xác định giá trị cho tài sản . Lần thử thứ hai của tôi đã thành công với dòng lệnh sau:

gradle jar -PartifactId=WhoCares 

Vì mục đích thử nghiệm, tôi vừa xác định thuộc tính bằng -P. Tôi không chắc làm thế nào bạn đang cố gắng để xác định tài sản của bạn, nhưng có lẽ đó là phần còn thiếu. Mà không nhìn thấy stacktrace của ngoại lệ của bạn thật khó để biết chắc chắn, nhưng ví dụ trên làm việc hoàn hảo cho tôi và dường như để giải quyết vấn đề của bạn.

6

Ngoài @ emil-Lundberg giải pháp tuyệt vời 's, tôi muốn hạn chế việc xử lý tài nguyên để chỉ các tập tin mục tiêu mong muốn:

xây dựng.gradle

processResources { 
    filesMatching("**/applicationContext.xml") { 
     expand(project: project) 
    } 
} 

Một lưu ý thêm: nếu ${...} ngoặc đang gây "Không thể giải quyết giữ chỗ" lỗi, bạn có thể lựa chọn sử dụng <%=...%>. N.B. được thử nghiệm với tệp *.properties, không chắc chắn cách thức này sẽ hoạt động đối với tệp XML.

+2

Không hiệu quả đối với tôi. Tôi đã làm khác nhau: 'processResources { filesĐối sánh (" **/application.properties ") { mở rộng (project.properties) }' } – gmaslowski

+0

Có (xin lỗi). Tôi vừa sao chép mã từ dự án của tôi ... nơi tôi đã đặt tiền tố cho các biến của mình bằng 'project. *' E.g. ''. –

1

đây là những gì làm việc cho tôi (Gradle 4.0.1) trong một dự án đa mô-đun:

trong /webshared/build.gradle:

import org.apache.tools.ant.filters.* 

afterEvaluate { 
    configure(allProcessResourcesTasks()) { 
     filter(ReplaceTokens, 
       tokens: [myAppVersion: MY_APP_VERSION]) 
    } 
} 


def allProcessResourcesTasks() { 
    sourceSets*.processResourcesTaskName.collect { 
     tasks[it] 
    } 
} 

và biến MY_APP_VERSION của tôi được định nghĩa trong top-level build.gradle file:

ext { 

    // application release version. 
    // it is used in the ZIP file name and is shown in "About" dialog. 
    MY_APP_VERSION = "1.0.0-SNAPSHOT" 
} 

và tập tin nguồn của tôi là trong /webshared/src/main/resources/version.properties:

# Do NOT set application version here, set it in "build.gradle" file 
# This file is transformed/populated during the Gradle build. 
[email protected]@ 
0

Tôi đã gặp phải sự cố tương tự khi di chuyển từ từ maven sang gradle build. Và cho đến nay các giải pháp đơn giản nhất/đơn giản nhất là chỉ đơn giản là làm lọc cho mình như:

proccessResources { 
    def buildProps = new Properties() 
    buildProps.load(file('build.properties').newReader()) 

    filter { String line -> 
    line.findAll(/\$\{([a-z,A-Z,0-9,\.]+)\}/).each { 
     def key = it.replace("\${", "").replace("}", "") 
     if (buildProps[key] != null) 
     { 
      line = line.replace(it, buildProps[key]) 
     } 
    } 
    line 
    } 
} 

này sẽ tải tất cả các thuộc tính từ tập các thuộc tính quy định và lọc tất cả các "$ {some.property.here}" loại trình giữ chỗ. Hỗ trợ đầy đủ các thuộc tính được phân tách bằng dấu chấm trong tệp * .properties.

Là phần thưởng bổ sung, nó không xung đột với trình giữ chỗ loại $ someVar như expand(). Ngoài ra, nếu trình giữ chỗ không thể được đối sánh với thuộc tính, nó không được chạm vào, do đó làm giảm khả năng xung đột tài sản từ các nguồn khác nhau.

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