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

替换GWT UIBinder XML文件中的版本号变量,gwt,maven,uibinder,Gwt,Maven,Uibinder,帮助我找到替换ui.xml中版本变量的最佳方法 <gwt:HTML> <span>Current version: ${version}</span> </gwt:HTML> 当前版本:${version} 我可以使用Maven资源插件吗?像这样: <resource> <directory>src/main/java</directory>

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

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

当前版本:${version}
我可以使用Maven资源插件吗?像这样:

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

src/main/java
真的
**/*.ui.xml

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

没错,UIBinder模板是GWT客户端代码的一部分,可以编译为JavaScript

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

  • 将其硬编码到客户端代码的某个地方,例如,
    EntryPoint
    类中,作为静态最终常量
  • 通过托管页面从服务器端代码公开它,并通过执行以下操作在客户端代码中读取它
  • 编写一个简单的示例来创建一个UI小部件,该小部件生成代码以显示当前版本。这篇文章是对发电机的一般介绍

  • 可能还有其他的,但这些是我脑海中第一个想到的,从最少的努力到最大的努力。

    因为您的Java文件将在您有机会更改变量之前被编译下来,所以您尝试的普通过滤器将无法工作。然而,我能够通过使用替代文件中的字符串来实现类似的效果。对我来说,有一个像你建议的那样的设置要干净得多,在这个设置中,
    ${my_variable}
    格式的变量可以始终替换为某个当前版本

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

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

    public class VersionManager {
      private static String version="empty";
    
      public static String getVersion(){
        return version;
      }
    }
    
    中,我添加了以下行(可选):

    v${project.version}{BUILD\u ID}
    
    然后包括maven replacer插件,并按如下方式进行配置:

         <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>
    
    
    com.google.code.maven-replacer-plugin
    替代者
    1.5.0
    验证
    代替
    --YourDirectoryPath--/shared/VersionManager.java
    私有静态字符串版本=\“*\”;
    私有静态字符串version=“${display\u version}”;
    
    如您所见,我告诉插件替换包含
    private static String version=“*”以新行显示,包含大部分相同的文本,但在引号内包含所需的版本号

    您可以通过运行
    mvn validate
    来测试这一点,而无需编译整个项目,它将运行替换,并应显示在源文件中


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

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

    <div id="versionInfo" style="display: none;">${project.version}</div>
    
    如果您使用GIN injection,一个好的做法是有一个版本提供程序:

    @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));
        [...]
    }
    

    如果你使用git,maven buildversion插件就是一个很好的组合。请注意,这会让你的SCM疯狂,因为你在每次验证过程中都会更新你的源代码。因此,在某些情况下,仅打开项目就会将其标记为已更改。我尝试这条路线时很痛苦,同意
    git更新索引——假设必须保持不变。blog.pagebakers.nl/2009/01/29/git-ignering-changes-in-tracked-files/Option#3确实是唯一有效的方法。这是两年前实施的。诚然,对于这样一个向文件中添加数字的简单情况来说,这实在是太复杂了。
    
    RootPanel panel = RootPanel.get("versionInfo");
    String version = panel.getElement().getInnerText();
    RootPanel.getBodyElement().removeChild(panel.getElement());
    
    @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));
        [...]
    }