Как отфильтровать ресурс в Maven, заменив его на зависимости artifactId? - PullRequest
5 голосов
/ 11 февраля 2010

Я пытаюсь создать банку, в которой в качестве ресурса используется файл XML. Я хотел бы применить фильтр к этому XML, чтобы вставить имя зависимости в XML. Фильтрация работает, потому что я смог вставить ${project.build.finalName} и заменить его. Я обнаружил один намек , что искомое свойство может быть

${project.dependencies[0].artifactId}

но это не похоже на работу. Я ищу заменить

<fileName>${project.dependencies[0].artifactId}</fileName>

с

<fileName>OtherLibrary</fileName>

Это возможно?

xml, который находится в src / main / resources:

<somenode>
  <fileName>${project.dependencies[0].artifactId}</fileName>
</somenode>

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>Thing</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Thing</name>
<url>http://maven.apache.org</url>
<build>
    <resources>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
<dependencies>
    <dependency>
        <groupId>com.pts</groupId>
        <artifactId>OtherLibrary</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>
</project>

Ответы [ 2 ]

7 голосов
/ 11 февраля 2010

Блин, вы правы, это свойство не заменяется при фильтрации ресурсов. Это странно и звучит как ошибка в Плагине ресурсов Maven , потому что это свойство правильно интерполируется во время фазы process-resources, как я продемонстрирую в обходном пути, который я предлагаю ниже (на основе плагин antrun и задача replace).

Сначала добавьте в свой POM следующее:

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
        <phase>process-resources</phase>
        <configuration>
          <tasks>
            <echo>${project.dependencies[0].artifactId}</echo><!-- I'm a test -->
            <replace file="${project.build.outputDirectory}/myxmlfile.xml" 
                     token="@@@" value="${project.dependencies[0].artifactId}"/> 
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Затем обновите файл XML на:

<somenode>
  <fileName>@@@</fileName>
</somenode>

С этими изменениями выполнение mvn process-resources даст следующий результат:

$ cat target/classes/myxmlfile.xml 
<somenode>
  <fileName>OtherLibrary</fileName>
</somenode>

Что доказывает, что свойство интерполировано (но не установлено во время maven-фильтрации ресурсов) 1 . А если вам нужно отфильтровать более одного файла, задача replace может принять набор файлов. Адаптируйте его под свои нужды.

1 На самом деле было бы неплохо создать новую Jira для этой ошибки в Maven 2.x Resources Plugin . I ' мы создали MRESOURCES-118 .

1 голос
/ 12 февраля 2010

Индексированные свойства будут доступны только внутри конфигурации плагина благодаря способу, которым Maven интерполирует POM - так что он доступен для задачи замены antrun, но не для фильтрации.

Однако доступ к зависимостям по индексу не очень надежен - он подвержен изменениям в родительском элементе. Вместо этого вы можете использовать следующее в pom.xml:

<properties>
  <fileName>some-name</fileName>
</properties>
...
<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>${fileName}</artifactId>
  ...
</dependency>

Затем можно продолжить фильтрацию, используя имя свойства:

<somenode>
  <fileName>${fileName}</fileName>
</somenode>
...