Что хороший путь состоит в том, чтобы обработать номер версии в JAVA-приложении?

Вы не можете запретить дочернему классу определять собственный конструктор копирования / перемещения. Тем не менее, это предотвратит его «из коробки», то есть если вы его не предоставите или используете встроенный конструктор по умолчанию, он также будет помечен как удаленный. Причина, по которой вы получаете ошибку здесь, когда вы пытаетесь просто определить конструктор по умолчанию, заключается в том, что вам не разрешено делать это во внешнем определении, когда член или база неявно удалили его. Если бы вы использовали

class DerivedClass : public BaseClass {
public:
  DerivedClass(const DerivedClass &) = default;
  bool doSomething() override;
};

, код скомпилировался бы, и вы бы получили ошибку, только если вы на самом деле попытаетесь вызвать конструктор копирования. Это работает, потому что встроенное неявное значение по умолчанию разрешено, даже если член или база неявно удаляют его, а конечный результат - конструктор, неявно удаляемый.

25
задан abatishchev 14 June 2010 в 14:15
поделиться

6 ответов

Я начну этот пост, заявив, что я использую Apache Maven для сборки. Вы также можете сделать то же самое с Ant или другим инструментом, но это то, что я сделал с помощью maven.

Лучший способ, который я нашел, чтобы справиться с этим, это использовать версию вашего проекта плюс ревизию subversion как номер сборки. Из Maven вы можете включить следующее. Это даст вам номер версии subversion как $ {scm.revision}.

<build>
    <plugins>
      <plugin>
        <artifactId>maven-scm-plugin</artifactId>
        <executions>
          <execution>
            <id>getting-scm.revision</id>
            <phase>validate</phase>
            <goals>
              <goal>update</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

После этого я использую его как часть манифеста jar-файла в качестве Версии реализации.

  <plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.1</version>
    <configuration>
      <archive>
        <manifestEntries>
          <Implementation-Version>${this.version}.${scm.revision}</Implementation-Version>
        </manifestEntries>
      </archive>
    </configuration>
  </plugin>

Приятная вещь в том, что Вы можете получить доступ к этому из кода, используя следующее:

Package p = getClass().getPackage();
String version = p.getImplementationVersion();

Это дает вам полный номер сборки, такой как «1.0.13525», где последним номером является ревизия Subversion.

27
ответ дан 28 November 2019 в 21:16
поделиться

Так как я использую круиз-контроль и Ant , чтобы собрать все Я закончил, по крайней мере, на данный момент, используя свойство $ {label} , переданное в вызов ant для построения проекта. В моем файле ant я использую задачу Ant «replace» , чтобы изменить файл свойств, который содержит ресурс about box с именем Application.version, для включения этой метки.

Я планирую изменить с пометить инкрементатор на инкрементатор меток svn и затем использовать номер ревизии svn. Это просто немного больше работы и требует внесения изменений в файл конфигурации круиз-контроля.

0
ответ дан 28 November 2019 в 21:16
поделиться

Сценарий сборки должен создать файл свойств, содержащий версию. Это хорошая идея, чтобы получить ревизию # непосредственно из SVN. Таким образом, вы можете обратиться к нему в тестах. Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.

Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.

Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.

Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Then constructing xx.yy.zz string, place it in another file which will be later included into jar. Note that xx.yy are taken from external parameters, this is major-minor version.

<target name="getrev">
    <exec executable="svn" output="svndump">
        <arg value="info"/>
        <arg value="${my.svn.url}"/>
    </exec>

    <property file="svndump"/>
    <property name="my.build" value="${Revision}"/>
    <property name="my.rev" value="${my.ver}.${my.build}"/>
    <echo message="current revision is ${my.rev}"/>

    <property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/>
    <echo message="${my.rev}" file="${my.dir.projects}/revision"/>

    <delete file="svndump"/>
</target>
7
ответ дан 28 November 2019 в 21:16
поделиться

С Maven я использовал buildnumber-maven-plugin , который получает номер ревизии из Subversion или использует последовательность или метку времени, которая затем используется заменить заполнитель $ {buildNumber} где угодно. Я предполагаю, что другие инструменты сборки и серверы непрерывной интеграции имеют аналогичные функции. Найдите в своей любимой поисковой системе «номер сборки ».

3
ответ дан 28 November 2019 в 21:16
поделиться

Ты делаешь это слишком сложным. SVN предоставляет номер версии в виде макроса, например, CVS.

Создайте простой инверсионный файл, содержащий константу, и сделайте так, чтобы SVN инстанцировал это с помощью макроса, например,

public interface IVersionNumber {
    public static final String version = "$Id$" ;
}

. Вы должны указать SVN использовать ключевые слова в этом файле, как

$ svn propset svn: ключевые слова «Id» IVersion.java

Вы можете прочитать о свойствах здесь .

2
ответ дан 28 November 2019 в 21:16
поделиться

Мы давно использовали JReleaseInfo . Вы можете установить его в своем скрипте Ant (мы не используем Maven для наших проектов), и он автоматически увеличивает номер версии. Он также имеет некоторые приятные дополнения в том, что он генерирует класс, содержащий всю информацию. Вы можете просто вызвать этот класс в своем коде, чтобы получить готовые строки для использования, или вызвать класс из командной строки, чтобы он распечатал номер версии без необходимости изменения какого-либо кода.

1
ответ дан 28 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: