Невозможно добавить динамическое свойство к ресурсу Maven, расположенному по пути сборки

Я пытаюсь настроить свойства в моем config.ini, который находится в src/main/config, используя pom.xml, как описано в этом ответе, но это не так. не работает.

Я поместил в src/main/config файл config.ini, где присутствует следующая строка: runtime_mode=${runtime.mode} когда я пытаюсь получить доступ к ключу runtime_mode во время выполнения, я получаю строку ${runtime.mode} вместо DEBUG или PRODUCTION, как определено в pom.xml. Когда я использую ${runtime.mode} в файле *.html, он заменяется соответствующим значением, как и ожидалось.

Таким образом, это не работает только тогда, когда ресурс находится в пути сборки.

Я подозреваю, что неправильно определяю ресурс, но не могу понять, что не так.

Это часть сборки моего pom.xml:

<project>
    <properties>
        <runtime.mode>DEBUG</runtime.mode>
    </properties>

    <build>
        <finalName>${project.name}</finalName>
        <resources>
          <resource>
            <directory>src/main/config</directory>
            <filtering>true</filtering>
         </resource>
        </resources>

        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <webResources>
                        <resource>
                          <!-- this is relative to the pom.xml directory -->
                          <directory>src/main/webapp</directory>
                          <filtering>true</filtering>
                          <includes>
                              <include>bower.json</include>
                              <include>index.html</include>
                          </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Мое приложение представляет собой проект war, созданный с использованием следующего архетипа:

<archetype>
      <groupId>com.ibm.tools.archetype</groupId>
      <artifactId>webapp-jee7-liberty</artifactId>
      <version>1.0</version>
      <description>JEE7 web application targeting WebSphere Liberty archetype</description>
</archetype>

ОБНОВЛЕНИЕ: мой config.ini перемещен в src\main\resources и изменен мой тег <resource> следующим образом:

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>config.ini</include>
            </includes>
        </resource>
    </resources>

Но теперь я не могу прочитать какой-либо ресурс, расположенный в src/main/resources из кода, например, я положил туда sql.xml, где все мои sql-запросы.

Попытка чтения по следующему коду:

private static Properties readProperties(String xmlFileName) throws Exception {
         Properties properties = new Properties();
         InputStream is = SQLProvider.class.getClassLoader().getResourceAsStream(xmlFileName);
         properties.loadFromXML(is);
         return properties;
    }

Но выдает ошибку:

java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203) ~[?:1.8.0_45]
    at java.util.Properties.loadFromXML(Properties.java:881) ~[?:1.8.0_45]
    at ***.SQLProvider.readProperties(SQLProvider.java:26) ~[classes/:?]

person Anatoly    schedule 21.04.2016    source источник
comment
Есть ли у вашего архетипа файл archetype.xml или archetype-metadata.xml в каталоге META-INF?   -  person Ahatius    schedule 21.04.2016
comment
Во-первых: поместите config.ini вместо src/main/resources. Эта папка специально для таких файлов. Второе: замена происходит из-за элемента <filtering>true</filtering> в файле pom.xml, но вы не включили config.ini в фильтрацию. Поэтому замена происходит только в файле index.html.   -  person MichaelK    schedule 21.04.2016
comment
@Ahatius, нет, не было   -  person Anatoly    schedule 21.04.2016
comment
@MichaelKarnerfors, вы хотите добавить <includes>config.ini</includes> в тег ресурса? Что касается конфигурации и ресурсов, я нашел здесь интересный ответ: stackoverflow.com/a/4183095/947111 попытаюсь реализовать его. Сейчас   -  person Anatoly    schedule 21.04.2016
comment
@MichaelKarnerfors, попытался внести изменения, как вы предложили, но это не сработало, я обновил свой вопрос.   -  person Anatoly    schedule 21.04.2016
comment
Извините, мне не повезло, потому что я совершенно не знаком с этим архетипом.   -  person MichaelK    schedule 21.04.2016


Ответы (1)


попробуйте использовать maven-replacer-plugin, вы можете заменить любой токен, определенный во внешнем файле.

Пример

      <properties>
         <runtime.mode>DEBUG</runtime.mode>
      </properties>

     <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>maven-replacer-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <ignoreMissingFile>false</ignoreMissingFile>
                <file>path to file/config.ini</file>
                <regex>false</regex>
                <replacements>
                    <replacement>
                        <token>$runtime.mode$</token>
                        <value>${runtime.mode}</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>
person Hisham Khalil    schedule 21.04.2016