2014-05-15 61 views
3

我想從它使用gradle這個建設項目我的Java項目中訪問構建信息。我需要訪問的信息是由teamcity生成的內部版本號,生成vcs編號等。這些很容易通過maven訪問,並使用maven-replacer插件,這些插件可以在屬性文件中替換。首先,有沒有其他方法可以達到同樣的效果?然後,如何做到這一點? :)搖籃:訪問建立信息

我想盡了辦法共享here,但我總是空的版本號。

在行家我放置在屬性文件(project.properties)項目以保持關鍵值對連鍵是象

project.groupId,project.artifactId,project.version, 那些項目信息maven.build.timestamp

我希望使用gradle訪問相同的構建信息。 。聚甲醛看起來象下面這樣:

    <!-- Write project version number to file --> 
       <plugin> 
        <groupId>com.google.code.maven-replacer-plugin</groupId> 
        <artifactId>maven-replacer-plugin</artifactId> 
        <version>1.3.8</version> 
        <executions> 
         <execution> 
          <phase>prepare-package</phase> 
          <goals> 
           <goal>replace</goal> 
          </goals> 
         </execution> 
        </executions> 
        <configuration> 
         <includes> 
          <!-- replace the token in this file --> 
          <include>target/classes/project.properties</include> 
         </includes> 
         <replacements> 
          <replacement> 
           <token>PROJECT_GROUP</token> 
           <value>${project.groupId}</value> 
          </replacement> 
          <replacement> 
           <token>PROJECT_ARTIFACT</token> 
           <value>${project.artifactId}</value> 
          </replacement> 
          <replacement> 
           <token>PROJECT_VERSION</token> 
           <value>${project.version}</value> 
          </replacement> 
          <replacement> 
           <token>PROJECT_BUILD_DATE</token> 
           <value>${maven.build.timestamp}</value> 
          </replacement> 
          <replacement> 
           <token>BUILD_NUMBER</token> 
           <value>${build.number}</value> 
          </replacement> 
         </replacements> 
        </configuration> 
       </plugin> 

什麼Maven的替代品插件不爲取代值對象的屬性,可以在Java應用程序中使用。

我需要使用gradle這個訪問相同的屬性。

在POM

團隊市配置如下:

<ciManagement> 
    <system>Team City</system> 
    <url>http://teamcity.mycompany.com/teamcity/project.html?projectId=bt007 
    </url> 
</ciManagement> 

build.gradle文件,我定義如下任務:

task getProjectGroup << { 
    ext.projectGroup = System.getProperty("project.group") 
    println "Project Group: $projectGroup" 
    } 

我得到執行此任務時的輸出如下:

:service:getProjectGroup 
Project Group: null 

BUILD SUCCESSFUL 
+0

如果你得到'null',你的TeamCity版本不會設置這個系統屬性,你也不能從Maven訪問它。在屬性文件中替換佔位符是配置'processResources'任務的問題(請參閱[Gradle Build Language Reference](http://gradle.org/docs/current/dsl/index.html)中的'Copy')。 –

+0

我無法在上面的Maven POM中找到任何TeamCity屬性。 –

+0

已經更新上面。還添加了團隊城市配置以完成問題。 – Aspirant

回答

1

我在我的項目上做了一些非常類似的事情 - 打包構建inf o放入可從Java應用程序的類路徑中讀取的屬性文件中。

下面是如何實現這一目標的搖籃腳本:

tasks.withType(Jar).all { Jar jar -> 
    jar.doFirst { 
     String jarType = jar.extension 
     if(jar.classifier) jarType = jar.classifier 
     String fileName = "project.properties" 
     ant.propertyfile(file: "${jar.temporaryDir}/${fileName}") { 
      entry(key: "PROJECT_GROUP", value: project.group) 
      entry(key: "PROJECT_ARTIFACT", value: project.archivesBaseName) 
      entry(key: "PROJECT_VERSION", value: project.version) 
      entry(key: "PROJECT_BUILD_DATE", value: new Date()) 
      entry(key: "BUILD_NUMBER", value: hasProperty("teamcity") ? teamcity["build.number"] : "local") 
     } 
     String intoPath = "your/package/name/here/${project.name}/${jarType}" 
     jar.from(jar.temporaryDir) { 
      include fileName 
      if(jar instanceof War) intoPath = "WEB-INF/classes/${intoPath}" 
      into(intoPath) 
     } 
     println "\tCreated ${intoPath}/${fileName}" 
    } 
} 

在這裏,我將功能添加到每個Jar任務(包括War)創建一個properties文件,檔案,包括它的類路徑根據your/package/name/here/${project.name}/${jarType}/project.properties

這是搖籃的美麗。它使得這樣的定製非常簡單 - 不需要插件。

然後,在我的應用程序讀取性能,我注入或硬編碼到該文件的預期路徑和負載性質是這樣的:

public Properties lookupClassPathResource(String pathToResource) { 
    Properties p = null; 
    org.springframework.core.io.Resource r = new org.springframework.core.io.ClassPathResource(pathToResource); 
    if(r.exists()) { 
     try { 
      p = org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(r); 
     } catch (IOException e) { 
      //log or wrap/rethrow exception 
     } 
    } 
    return p; 
} 

和有趣的時間由所有了!

編輯:很顯然OP中鏈接的問題/答案(關於訪問build.number)有點過時了。您可以使用TeamCity通過Gradle初始化腳本隱式添加到項目中的teamcity屬性來代替System.getProperty("build.number")。上面的代碼已被修改以反映這一點。其他示例請參見this question

+0

它是一個很好的方法。我會繼續努力並保持發佈。謝謝。 – Aspirant

+0

在完成任務後,即在執行'build'後,我仍然在屬性文件中得到'null'的值。 – Aspirant

+0

這沒有意義 - 即使您沒有明確設置內置項目屬性,它們也會具有非空默認值。你仍然試圖拉系統屬性,而不是使用'項目'?嘗試將此行添加到build.gradle文件中,然後從命令行運行'gradlew x'併發布結果:'task x << {println「$ project.group $ project.version」}'。至少它應該打印' unspecified'。 – superEb