2012-10-09 88 views
1

我的团队正在与2个团队合作:服务器团队和客户团队。我们服务器团队将为客户团队提供API。这些API有很多版本,因此我们需要匹配服务器版本和相应的客户端版本 - 例如,如果服务器版本号比支持版本大得多并且需要更新,旧客户端将拒绝工作。使Web应用程序自动确定并了解其版本

由于上述原因,我们需要将构建版本的服务器发送回客户端。目前我们正在通过在Config类中添加一个静态字段来完成此操作。但我担心的是,我们必须在每次构建新服务器时手动增加它,尤其是在我们每天构建时。这个过程相当容易出错,并且不太优雅。

在我的搜索中,我看到很多关于使用maven插件来管理构建版本的建议。尽管我非常赞赏自动过程,但它仍不会让服务器知道内部版本号。服务器应用程序应该能够通过API调用将其构建版本返回给客户端。

我曾想过在某处编写数字版本(远程数据库,服务器上的文件)。 有什么办法让构建过程自动增加构建版本,但应用程序本身也可以在运行时检索这个数字吗?

我们使用Maven构建并将Jenkin作为集成构建服务器。

回答

1

我通常阅读Maven打包在JAR中的MANIFEST.MF文件的版本。 默认情况下,它看起来是这样的:

Manifest-Version: 1.0 
Built-By: user 
Build-Jdk: 1.6.0_35 
Created-By: Apache Maven 3.0.4 
Archiver-Version: Plexus Archiver 

Name: Artifact 
Implementation-Build: 1.14-SNAPSHOT 
Version: 1.14-SNAPSHOT 

从这个文件我读的版本元素,并用它来为实例显示应用程序的构建版本(在WAR/EAR包装罐的所有版本例如)。 事情是这样的代码应工作:

public static String getApplicationVersion() { 
     String version = null; 
     try { 
      final List<VersionsUtil.Version> moduleVersions = VersionsUtil.getModuleVersions(Thread.currentThread().getContextClassLoader()); 
      for (VersionsUtil.Version moduleVersion : moduleVersions) { 
       if (moduleVersion.name.equals("<NAME OF ARTIFACT TO GET>")) { 
        version = moduleVersion.version; 
        break; 
       } 
      } 
     } catch (IOException e) { 
      // We'll return null... 
     } 
     return version; 
    } 


public class VersionsUtil { 
    private static final Logger LOG = LoggerFactory.getLogger(VersionsUtil.class); 

    /** 
    * Returns a list of the module versions available for the given class loader. 
    * 
    * @param classLoader the class loader to return module versions for 
    * @return a list of module versions 
    * @throws IOException in case there's an error reading the manifest 
    */ 
    public static List<Version> getModuleVersions(final ClassLoader classLoader) throws IOException { 
     return processResources(classLoader.getResources("META-INF/MANIFEST.MF")); 
    } 

    private static List<Version> processResources(final Enumeration<URL> resources) throws IOException { 
     final List<Version> moduleVersions = new ArrayList(); 
     while (resources.hasMoreElements()) { 
      URL resource = resources.nextElement(); 
      Version v = process(resource); 
      if (v != null) { 
       moduleVersions.add(v); 
      } 
     } 
     return moduleVersions; 
    } 

    private static Version process(final URL resource) { 
     try { 
      Properties p = readResource(resource); 
      return createVersion(p); 
     } catch (IOException e) { 
      LOG.warn("Failed to read resource: " + resource, e); 
      return null; 
     } 
    } 

    private static Version createVersion(final Properties p) { 
     Object name = p.get("Name"); 
     if (name != null) { 
      return new Version((String) name, (String) p.get("Version")); 
     } 
     return null; 
    } 

    private static Properties readResource(final URL resource) throws IOException { 
     LOG.trace("Reading resource: " + resource); 
     InputStream is = resource.openStream(); 
     Properties p = new Properties(); 
     p.load(is); 
     is.close(); 
     return p; 
    } 

    public static final class Version { 
     String name; 
     String version; 

     private Version(final String name, final String version) { 
      this.name = name; 
      this.version = version; 
     } 

    } 
} 

更新时间: 如果你想在MANIFEST.MF詹金斯buildnumber你可以像配置POM.XML

... 
    <plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <archive> 
     <manifestSections> 
      <manifestSection> 
      <name>${project.name} (${project.artifactId})</name> 
      <manifestEntries> 
       <Version>${project.version}${build.number}</Version> 
      </manifestEntries> 
      </manifestSection> 
     </manifestSections> 
     </archive> 
    </configuration> 
    </plugin> 
    ... 
    <properties> 
    <build.number /> 
    </properties> 
    ... 

如果你有兴趣的标记WAR/EAR文件,您必须相应地添加清单配置。 然后在您的Jenkins作业配置中,只需将BUILD_NUMBER参数传递给maven进程,如下所示:-Dbuild.number=$BUILD_NUMBER

+0

抱歉,我以前没有看到您的答案,但这是否意味着我必须使用Maven来控制我的版本?我对这个过程并不熟悉。你能否指点我一些教程(我找不到相关的源代码) –

+0

“我们正在使用Maven构建并将Jenkin作为集成构建服务器。”我以为你用maven来构建和打包? –

+0

是的,我们使用Maven,但是我们不使用Maven版本控制。我们只用它来包装和部署 –

相关问题