帮助我找到替换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}变量,也不替换它。
答案 0 :(得分:3)
您是对的,UIBinder模板是GWT客户端代码的一部分,可以编译成JavaScript。
我能想到的唯一方法是公开您的应用正在运行的版本:
EntryPoint
类中)将其硬编码为静态最终常量。可能还有其他人,但这些是我头脑中的第一个,从最少到最多的努力。
答案 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));
[...]
}