2010-02-10 4 views
3

У меня есть html-файл, который загружает апплет. Html должен ссылаться на jar по имени, и поскольку maven называет его на основе artifactid, версии и т. Д., Html нуждается в динамическом обновлении по мере развития проекта. Похоже, что фильтрация ресурсов - это путь, но я не могу понять, как должна выглядеть переменная для интерполяции. Мне бы хотелось что-то вроде строки $ {project.dependencies.myartifactid.version}, но это, похоже, не вариант, и у меня была горькая удача.Переменные проекта Maven для зависимостей

ответ

6

Вам понадобится что-то вроде ${project.dependencies[0].artifactId} где 0 - это индекс зависимости апплета в вашем военном модуле (см. PLXUTILS-37). И действительно, использование фильтрации ресурсов должно работать.

Обновление: Похоже, что есть ошибка в Плагине ресурсов Maven, это свойство не фильтруется, как указано в this question. Возможно, вам придется использовать обходное решение, предложенное в this answer.

+0

Бинго! Не нашел никаких указаний на то, что вы можете индексировать переменные таким образом. Спасибо, сэр.(Теперь, если бы я мог идентифицировать его по имени, а не по индексу. О, ну, это, безусловно, будет работать.) –

+0

@Erik Да, он будет хрупким (например, добавление зависимости может сломать все, чтобы это нужно было документировать), но, к сожалению, , Я не думаю, что есть что-то лучше. –

+0

на самом деле это работает только до версии maven antrun plugin версии 1.3. Начиная с 1.4 onward $ {project.dependencies [0] .artifactId} больше не интерполируется. – JayZee

-1

От http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide:

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

Другого варианта у вас есть, чтобы изменить набор ${project.build.finalName} на статическую строку в вашем POM:

<build> 
    <finalName>foo</finalName> 
</build> 
+0

Да, но апплет очень вероятен в банке, от которой зависит война, и это не даст вам название фляги для апплета. –

+0

Не понимал, что JAR является зависимостью. Тогда да, это не поможет. –

3

Насколько я понимаю, вы пытаетесь сохранить версию в актуальном состоянии, ожидая, что остальное останется неизменным. Есть две альтернативы.

Первый заключается в том, чтобы удалить версию из имени, чтобы HTML-код не изменялся. Вы можете увидеть практический пример, ища archiva-applet здесь: http://svn.apache.org/repos/asf/archiva/tags/archiva-1.3/archiva-modules/archiva-web/archiva-webapp/pom.xml

В этом примере, так как вы не хотите апплет в WEB-INF/classes так или иначе, он опущен из веб-приложение, а затем включены через плагин Dependency:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.0</version> 
    <executions> 
    <execution> 
     <id>copy</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>archiva-applet</artifactId> 
      <version>${project.version}</version> 
      <outputDirectory>src/main/webapp</outputDirectory> 
      <destFileName>archiva-applet.jar</destFileName> 
      </artifactItem> 
     </artifactItems> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Если вы используете Maven 2.1.0+, вы можете использовать фазу prepare-package и скопировать ее прямо на выход без изменения исходного каталога.

Затем вы ссылаетесь на апплет в HTML с единственным именем.

Альтернативное решение, если вы хотите, чтобы продолжить фильтрацию и сохранить версию, чтобы использовать общую собственность:

<properties> 
    <applet.version>1.2.3</applet.version> 
</properties> 

...

<dependency> 
    <groupId>my.group</groupId> 
    <artifactId>my.applet</artifactId> 
    <version>${applet.version}</version> 
</dependency> 

...

Вы затем может использовать ${applet.version} в HTML и все равно только изменить его в одном месте.