替换GWT UIBinder XML文件中的版本号变量

时间:2010-12-13 16:34:42

标签: gwt maven uibinder

帮助我找到替换ui.xml中的版本变量的最佳方法

<gwt:HTML>
    <span>Current version: ${version}</span>
</gwt:HTML>

我可以使用Maven资源插件吗?像这样:

        <resource>
            <directory>src/main/java</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.ui.xml</include>
            </includes>
        </resource>

我认为UIBinder是GWT客户端代码的一部分,它由gwt插件编译。此插件找不到我的$ {version}变量,也不替换它。

3 个答案:

答案 0 :(得分:3)

您是对的,UIBinder模板是GWT客户端代码的一部分,可以编译成JavaScript。

我能想到的唯一方法是公开您的应用正在运行的版本:

  1. 在客户端代码中的某处(例如,在EntryPoint类中)将其硬编码为静态最终常量。
  2. 通过您的主机页面从服务器端代码公开它,并通过this article suggests之类的操作在客户端代码中阅读。
  3. 编写一个简单的GWT generator来创建一个UI小部件,其代码生成为显示当前版本。本文是对发电机的一般介绍。
  4. 可能还有其他人,但这些是我头脑中的第一个,从最少到最多的努力。

答案 1 :(得分:3)

由于您的Java文件将在您有机会更改变量之前进行编译,因此您尝试的常规过滤器将无法正常工作。但是,我能够使用仅替换文件中的字符串的maven-replacer-plugin来实现类似的效果。对我而言,拥有一个类似你建议的设置,其中${my_variable}格式的变量可以始终被当前版本替换为更清晰。

然而,使用maven-replacer-plugin,你没有那么奢侈,因为它实际上是在修改原始源文件本身。因此,如果您告诉它在某个时间点将${my_variable}替换为Version 1.2.3,则该文件将不再包含文本"${my_variable}",因为它已经被替换。因此,您必须重新考虑替代策略。这就是我设置的......

我添加了一个名为“VersionManager”的共享类,它只有以下代码:

public class VersionManager {
  private static String version="empty";

  public static String getVersion(){
    return version;
  }
}

<project><properties>中,我添加了以下行(可选):

<display_version>v${project.version} #${BUILD_ID}</display_version>

然后包含maven-replacer-plugin并按如下方式配置:

     <plugin>
       <groupId>com.google.code.maven-replacer-plugin</groupId>
       <artifactId>replacer</artifactId>
       <version>1.5.0</version>
       <executions>
           <execution>
               <phase>validate</phase>
               <goals>
                   <goal>replace</goal>
               </goals>
           </execution>
       </executions>
       <configuration>
           <file>--yourDirectoryPaths--/shared/VersionManager.java</file>
           <replacements>
               <replacement>
                   <token>private static String version=\".*\";</token>
                   <value>private static String version="${display_version}";</value>
               </replacement>
           </replacements>
       </configuration>
   </plugin>

正如您所看到的,我告诉插件将包含private static String version="*";的行替换为包含大部分相同文本的新行,但在引号内包含所需的版本号。

您可以在不必编译整个项目的情况下通过运行mvn validate进行测试,这将运行替换并显示在源文件中。

然后您的服务器和客户端都知道它们在构建时运行的版本。

答案 2 :(得分:1)

另一个不使用replacer插件的解决方案是替换html主页中包含的div的值:

<div id="versionInfo" style="display: none;">${project.version}</div>

将webapp文件夹添加到maven配置中的网络资源(启用过滤):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    [...]
    <configuration>
        [...]
        <webResources>
            <resource>
            <directory>src/main/webapp</directory>
            <filtering>true</filtering>
                <includes>
                    <include>**/*.html</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

现在,在您的GWT代码中,您可以轻松获取版本值:

RootPanel panel = RootPanel.get("versionInfo");
String version = panel.getElement().getInnerText();
RootPanel.getBodyElement().removeChild(panel.getElement());

如果你使用GIN注入,那么一个好的实践就是拥有一个版本提供者:

@Provides
@Singleton
@Named("version")
protected String getVersion()
{
    RootPanel panel = RootPanel.get("versionInfo");
    if(panel == null)
    {
        return "unknow";
    }
    else
    {
        String version = panel.getElement().getInnerText();
        RootPanel.getBodyElement().removeChild(panel.getElement()); 
        return version;
    }
}

最后在你的小部件中注入版本:

[...]

@UiField(provided = true)
protected Label     versionLabel;

public MyWidget(@Named("version") String version)
{
    this.versionLabel = new Label(version);
    this.initWidget(uiBinder.createAndBindUi(this));
    [...]
}