Есть ли способ использования свойства maven в Java-классе во время компиляции

Я просто хочу использовать maven placeholder в моем классе Java во время компиляции, чтобы уменьшить дублирование.

Что-то вроде этого:

pom.xml

<properties>
  <some.version>1.0</some.version>
</properties>

SomeVersion.java

package some.company;

public class SomeVersion {

    public static String getVersion() {
        return "${some.version}"
    }

}

Ответ 1

просто создайте файл app.properties в src/main/resources с таким содержимым

application.version=${project.version}

тогда включите фильтрацию maven, как это.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

Что все в коде приложения просто читает свойства файла

ClassPathResource resource = new ClassPathResource( "app.properties" );
p = new Properties();
InputStream inputStream = null;
try {
    inputStream = resource.getInputStream();
    p.load( inputStream );
} catch ( IOException e ) {
    LOGGER.error( e.getMessage(), e );
} finally {
    Closeables.closeQuietly( inputStream );
}

и предоставить такой метод

public static String projectVersion() {
    return p.getProperty( "application.version" );
}

Ответ 2

Несмотря на то, что это не очень приятное решение, возможно с плагином ресурсов maven по умолчанию.

Сначала вам нужно указать плагин ресурса.

<project>
  <build>
    <!-- Configure the source files as resources to be filtered
      into a custom target directory -->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <filtering>true</filtering>
        <targetPath>../filtered-sources/java</targetPath>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>
</project>

Затем вам нужно будет изменить конфигурацию плагина компилятора по умолчанию.

<project>
  <build>
      <!-- Overrule the default pom source directory to match
            our generated sources so the compiler will pick them up -->
      <sourceDirectory>target/filtered-sources/java</sourceDirectory>
  </build>
</project> 

Ответ 3

Если вы работаете с Spring, вы можете ввести свойство. Шаги:

  • Внутри POM файла вы определяете все необходимые профили и каждый профиль должен иметь свое настраиваемое свойство, в вашем случае

<profile>
	<id>dev</id>
	<properties>
		<some.version>Dev Value</some.version>
	</properties>
</profile>

Ответ 4

Самый простой способ, которым я знаю, это использовать Templating Maven Plugin.

Добавьте объявление плагина к вашему pom:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>templating-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <id>filter-src</id>
            <goals>
                <goal>filter-sources</goal><!-- add this if you filter main sources -->
                <goal>filter-test-sources</goal><!-- add this if you filter test sources -->
            </goals>
        </execution>
    </executions>
</plugin>

Если вы фильтруете основные источники:

  • Создать папку src/main/java-templates
  • Переместите исходные файлы, которые вы хотите отфильтровать, в эту папку. Воспроизводите структуру дерева пакетов, как если бы вы были в src/main.

Если вы также фильтруете источники тестов:

  • Создать папку src/test/java-templates
  • Переместите исходные файлы, которые вы хотите отфильтровать, в эту папку. Воспроизводите структуру дерева пакетов, как если бы вы были в src/test.

Предполагая, что ваши источники содержат допустимые заполнители, например:

package some.company;

public class SomeVersion {

    public static String getVersion() {
        return "${project.version}"
    }

}

Теперь, когда вы compile или test ваш проект, эти заполнители должны быть уже оценены.

Надеюсь, что это поможет.