替换GWT UIBinder XML文件中的版本号变量
帮助我找到替换ui.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>
<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
类中,作为静态最终常量可能还有其他的,但这些是我脑海中第一个想到的,从最少的努力到最大的努力。因为您的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));
[...]
}