2013-03-21 3 views
3

Я пытаюсь добавить зависимую область привязки system к моей POM. Фокус в том, что у меня нет systemPath. Вместо этого у меня есть путь к файлу свойств, который содержит свойство, которое я могу использовать в качестве пути.Динамическое добавление зависимостей Maven от свойства

Я попытался использовать properties-maven-plugin, чтобы справиться с этим, но похоже, что системная зависимость будет решена до запуска плагина, и поэтому свойство, которое я пытаюсь определить, доступно недостаточно быстро.

Вот часть моей POM:

<profiles> 
    <profile> 
     <id>dylink</id> 
     <dependencies> 
      <dependency> 
       <artifactId>outside-lib</artifactId> 
       <groupId>com.foo</groupId> 
       <version>1.0</version> 
       <scope>system</scope> 
       <systemPath>${outsidelib.location}/outside-lib.jar</systemPath> 
      </dependency> 
     </dependencies> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>properties-maven-plugin</artifactId> 
        <version>1.0-alpha-2</version> 
        <executions> 
         <execution> 
          <phase>initialize</phase> 
          <goals> 
           <goal>read-project-properties</goal> 
          </goals> 
          <configuration> 
           <files> 
            <file>C:\path\to\file.properties</file> 
           </files> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

И я бегу что-то вроде mvn -P dylink compile и получить сказали, что мой systemPath недействителен, потому что это не абсолютный путь. (Свойство содержит абсолютный путь)

В качестве альтернативы, есть ли другой способ, которым я могу это сделать? Мне нужно иметь возможность запрашивать хост-систему для определения зависимости зависимости системы. Это не сработает, чтобы просто закодировать путь в POM.

ответ

5

Невозможно. Чтобы выполнять плагины, maven должен иметь все, что нужно «загрузить» в локальном репозитории. Он должен быть уверен в версиях зависимостей, которые часто определяются в свойствах. Следовательно, перед запуском плагинов он должен начать с поиска значений свойств перед загрузкой всего, что отсутствует. Вы хотите, чтобы плагины, которые будут выполняться до значения свойств определяются ...

Я предполагаю, что свойства плагин добавляют значения дополнительного свойства при выполнении, но это происходит только после проверки Maven зависимостей ...

+0

В конце концов, «чище» решение - попросить производителей вашей зависимости разместить его в общедоступном хранилище maven и добавить этот репозиторий в свой pom.xml. Maven будет искать его для вашей зависимости. Sonatype.org предлагает такие услуги ... – JVerstry

1

Я угадываю здесь, но если вам нужно указать его динамически, это потому, что вам нужно запустить его в другой среде. Что вы можете сделать, это по-прежнему использовать свойство Maven, но вы можете передать его в командной строке в качестве аргумента:

mvn -Doutsidelib.location=myAbsolutePathReadFromPropertyFileJustBefore 

И, конечно, вы должны прочитать файл свойств или установить переменную ENV перед запуском maven.

+0

Хорошей идеи, чтобы упростить проблемы. Я пробовал это, и Maven по-прежнему не любит переменную в systemPath. Я сдался и создал сценарий оболочки, который устанавливает системную банку в локальный репозиторий, прежде чем запускать Maven, и это работает. Я все еще озадачен, почему я не мог заставить это работать. –

Смежные вопросы