Создание maven делает копирование файлов между зданием и запуском
Пересмотренный вопрос (старый вопрос ниже):
Проблема: при создании и запуске проекта плагина Jenkins в NetBeans с использованием Maven загрузчик классов Java, используемый log4j, не находит файлы (например, файл конфигурации, пользовательский приложение, JDBC-драйвер). Их нужно скопировать в другое место под target
, а затем они будут найдены.
Я думаю, что это решение: Я хочу предоставить maven дополнительный аргумент командной строки, настроенный в NetBeans. Это должно сделать maven сделать дополнительный шаг после сборки и перед запуском чего-либо. Этот шаг может быть либо копированием файлов (указанным в pom.xml, либо аргументами команды), либо может быть запущен script (указанный в pom.xml или аргументами командной строки).
Что добавить в pom.xml? Какой-то плагин maven?
Старый вопрос (для справки)
У меня есть проект maven для "my-jenkins-plugin". Мне нужно использовать log4j. В настоящее время у меня есть log4j.xml по этому пути:
./src/main/resources/log4j.xml
Когда я очищаю и создаю Netbeans, он копируется в эти места:
./target/classes/log4j.xml
./target/generated-classes/emma/classes/log4j.xml
./target/my-jenkins-plugin/WEB-INF/classes/log4j.xml
Однако log4j не находит файл из любого из этих мест. Мне нужно вручную скопировать его в это место:
./target/work/webapp/WEB-INF/classes/log4j.xml
И тогда он работает так, как ожидалось.
Подробнее: Maven 2, Netbeans 7.2. Это стандартный плагин Jenkins, проект изначально созданный с помощью mvn hpi:create
, а Netbeans использует Jetty для запуска Jenkins. Путь к классам, используемый при работе под NetBeans, - это java.class.path=C:\work\maven\boot\classworlds-1.1.jar
(который является существующим банком), и я не нашел способ добавить что-либо к этому пути к классам, но если я добавлю log4j.xml в корень этого файла jar, он также будет найден и работает (очевидно, это не удовлетворительное решение). Я знаю, работает ли log4j или нет, просто посмотрев на вывод консоли, либо это правильные строки журнала, либо страшная ошибка log4j:WARN No appenders could be found for logger (TestLog). log4j:WARN Please initialize the log4j system properly.
, и ничего больше.
Вопрос. Как я могу использовать
- log4j.xml, найденный в первом наборе местоположений,
- или log4j.xml, найденный в местоположении вне целевого каталога, например C:\log4j\log4j.xml
- или сделать maven и/или netbeans скопировать log4j.xml в место, где он находится сейчас
- или любой другой хороший способ позволить мне предоставить мой плагин log4j.xml после очистки и сборки автоматически, при отладке с NB?
Ответы
Ответ 1
Вот как я получил maven для копирования файлов .class и .jar в новое место перед выполнением цели hpi:run
. log4j.xml
по-прежнему копируется в моем Java-коде в блоке static{}
до создания экземпляра log4j. Чтобы использовать этот профиль, я добавил -P netbeans
в аргументы командной строки maven в Netbeans:
Определение профиля и плагина в pom.xml
:
<profiles>
<profile>
<id>netbeans</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>copy</id>
<phase>compile</phase>
<configuration>
<target>
<ant antfile="${basedir}/log4j/ant.xml">
<target name="log4jcopy"/>
</ant>
</target>
</configuration>
<goals>
<goal>run</goal> <!-- means antrun:run -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Построить XML для ant, log4j/ant.xml
:
<project default="log4jcopy">
<target name="log4jcopy">
<echo message="Copying class files so that log4j finds them at runtime."/>
<copy verbose="true"
todir="target/work/webapp/WEB-INF/lib">
<fileset
dir="log4j"
includes="mysql-connector-java-5.1.6.jar" />
</copy>
<copy verbose="true"
todir="target/work/webapp/WEB-INF/classes/hyde/jenkins/myplugin">
<fileset
dir="target/classes/hyde/jenkins/plugins/myplugin"
includes="LogAppender*.class" />
</copy>
</target>
</project>
Ответ 2
Вы можете использовать Maven Ant плагин для запуска Ant script, который сделал копирование, или используйте Плагин ресурсов Maven, который, по-видимому, нацелен на ваш конкретный прецедент копирования файлов в выходной каталог.
Также помните, что вы можете параметризовать свою сборку, как описано здесь (игнорируйте часть Jenkins этого названия, ответ относится к общему использованию Maven).
Ответ 3
Вы можете использовать этот плагин в профиле:
<pluginRepositories>
<pluginRepository>
<id>evgenyg</id>
<name>Evgeny Goldin repo</name>
<url>http://evgenyg.artifactoryonline.com/evgenyg/repo/com/github/goldin/</url>
</pluginRepository>
</pluginRepositories>
<profiles>
<profile>
<id>copy</id>
<build>
<plugins>
<plugin>
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
<execution>
<id>create-archive</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<resources>
<resource>
<targetPath>${project.build.outputDirectory}/work/webapp/WEB-INF/classes/</targetPath>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>log4j.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Чтобы активировать: mvn -Pcopy generate-resources
Ответ 4
Вы можете использовать плагин копировать артефакт. Как и в hudson.