Есть ли способ использования свойства 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
ваш проект, эти заполнители должны быть уже оценены.
Надеюсь, что это поможет.