Заменить переменную номера версии в XML-файле GWT UIBinder - PullRequest
3 голосов
/ 13 декабря 2010

Помогите мне найти лучший способ замены переменной версии в моем 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 ]

3 голосов
/ 28 июля 2012

Поскольку ваши 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, который запуститподстановка и должна появиться в вашем исходном файле.

Тогда ваш сервер и клиент будут знать, какую версию они использовали, когда они были собраны.

3 голосов
/ 13 декабря 2010

Вы правы, шаблоны UIBinder являются частью клиентского кода GWT и скомпилированы в JavaScript.

Я могу только представить, какая версия вашего приложения работает:

  1. Жестко закодируйте его где-нибудь в своем коде на стороне клиента, например, в своем классе EntryPoint, в качестве статической конечной константы.
  2. Предоставьте его из кода на стороне сервера через хостингПрочтите страницу и прочитайте ее в своем клиентском коде, выполнив что-то вроде , в этой статье предлагается .
  3. Напишите простой генератор GWT , чтобы создать виджет пользовательского интерфейса с кодом.генерируется для отображения текущей версии.Эта статья представляет собой общее введение в генераторы.

Могут быть и другие, но это первые из моих голов, от минимальных до самых больших усилий.

1 голос
/ 18 июля 2014

Другое решение, без использования плагина replacer, заключается в замене значения div, содержащегося на вашей html-странице хоста:

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