Проблема Maven при переопределении свойства systemPath для конкретной среды

У меня возникли проблемы со сборкой maven, которая не работает так же, как в Windows (как это было в прошлом) или Linux (как я хочу сделать сейчас).

Я хочу построить проект, который зависит от другого проекта, который pom сам импортирует pom, который содержит путь Windows.

   my project   |           other project
                |
mybuild  -------|------> pom --------> pom with systemPath
            dependency        import
                |

Но в двух словах, вот мой пом:

<groupId>test.properties</groupId>
<artifactId>buildme</artifactId>
<version>1.0-SNAPSHOT</version>
...
<dependencies>
  <dependency>
    <groupId>test.properties.installme</groupId>
    <artifactId>module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <type>pom</type>
  </dependency>
</dependencies>

И я зависим от пом, который выглядит так (не под моим контролем)

<groupId>test.properties.installme</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
...
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>test.properties.installme</groupId>
      <artifactId>dependency</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>
</dependencies>

и проблема заключается в этом последнем пом (не под моим контролем):

<modelVersion>4.0.0</modelVersion>  
<groupId>test.properties.installme</groupId>
<artifactId>dependency</artifactId>
<version>1.0-SNAPSHOT</version>
...
<properties>
  <com.sun.tools.path>D:/java/jdk1.8.0_65/lib/tools.jar</com.sun.tools.path>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.sun</groupId>
      <artifactId>tools</artifactId>
      <version>1.8</version>
      <scope>system</scope>
      <systemPath>${com.sun.tools.path}</systemPath>
    </dependency>
  </dependencies>
</dependencyManagement>

У меня нет контроля над другим рассматриваемым проектом. Я полностью согласен, что рефакторинг для использования переменных среды вместо жестко закодированных путей решит мою проблему. Но вместо этого путь Windows определяется в свойстве. Можно было бы подумать, что переопределения стоимости имущества в зависимости от моей платформы будет достаточно. Но это не так.

К сожалению, в этом конкретном случае maven ведет себя плохо.

Перед применением любого переопределения свойства в любой форме (в settings.xml, -Dproperty=, переопределение в корневом pom) maven начинает создавать эффективный pom. И на этом этапе, если он находит шаблон, который я упоминал выше (зависимость от другого pom, который сам импортирует pom, содержащий путь Windows), то он говорит:

The POM for <groupId>:<artifactId>:jar:<version> is invalid, transitive dependencies (if any) will not be available

Как следствие, мой проект должен явно определить все зависимости второго проекта. И я не могу полагаться на переходные зависимости, которые доставляют мне много хлопот.

Чтобы проиллюстрировать проблему, я создал минимальный пример, показывающий проблему. Его можно найти здесь: https://github.com/fabricepipart/test-properties

Видите ли вы обходной путь для этого? Любой способ переопределить значение свойства и все еще извлечь выгоду из maven переходных зависимостей?

большое спасибо

0 ответов

Другие вопросы по тегам