【问题标题】:Replace version number variable in GWT UIBinder XML File替换 GWT UBinder XML 文件中的版本号变量
【发布时间】:2010-12-13 16:34:41
【问题描述】:

帮助我找到替换 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} 变量并且不要替换它。

【问题讨论】:

    标签: gwt maven uibinder


    【解决方案1】:

    你是对的,UIBinder 模板是 GWT 客户端代码的一部分,并且被编译成 JavaScript。

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

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

    可能还有其他的,但这些是我脑海中最先想到的,按照从最少到最多的努力顺序。

    【讨论】:

    • 选项#3 确实是唯一有效的方法。两年前实施的。诚然,对于这样一个简单的向文件添加数字的情况,它确实过于复杂。
    【解决方案2】:

    因为您的 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;
      }
    }
    

    &lt;project&gt;&lt;properties&gt; 中,我添加了以下行(可选):

    <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 来测试它而无需编译整个项目,这将运行替换并且应该出现在您的源文件中。

    那么你的服务器和客户端都知道它们在构建时运行的是什么版本。

    【讨论】:

    • 如果你使用 git 的话,maven buildversion 插件github.com/code54/buildversion-plugin 是一个很好的组合。
    • 请注意,这会使您的 SCM 发疯,因为您在每次验证通过时都会更新源代码。因此,在某些情况下,仅打开您的项目就会将其标记为已更改。当我尝试这条路线时很痛苦。
    • 同意。 git update-index --assume-unchanged 是必须的。 blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2021-03-23
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多