2014-05-15 59 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