修订问题(以下老问题):
问题:使用Maven在NetBeans中构建和运行Jenkins插件项目时,log4j 使用的Java类加载器找不到某些文件(如配置文件,自定义appender,JDBC驱动程序)。需要将它们复制到target
下的其他位置,然后找到它们。
我认为我想要的解决方案是:我想给maven一个额外的命令行参数,在NetBeans中配置。 这应该让maven在构建之后和运行之前做了额外的步骤。该步骤可以是文件复制(在pom.xml中指定,也可以由命令参数指定),也可以是运行脚本(在pom.xml中或命令行参数中指定)。
要添加到pom.xml的内容?一些maven插件?
旧问题(仅供参考)
我有一个关于“my-jenkins-plugin”的maven项目。我需要使用 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
(这是一个现有的jar),我还没有找到向此类路径添加任何内容的方法,但是如果我将 log4j.xml 添加到root该jar文件,它也被发现和工作(显然这不是一个令人满意的解决方案)。我知道log4j是否有效只是通过查看控制台输出,它是正确的日志行,还是可怕的log4j:WARN No appenders could be found for logger (TestLog). log4j:WARN Please initialize the log4j system properly.
错误而没有别的。
问题:我怎么能有
答案 0 :(得分:12)
您可以使用Maven Ant plugin运行执行复制的Ant脚本,或使用Maven resources plugin,这似乎是针对您将内容复制到输出目录的确切用例。
另请注意,您可以按照here所述参数化您的构建(忽略该标题的Jenkins部分,答案与Maven的一般用法有关)。
答案 1 :(得分:7)
您可以在个人资料中使用this plugin:
<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
答案 2 :(得分:3)
您可以使用复制工件插件。和哈德森一样。
答案 3 :(得分:2)
这就是我在执行hpi:run
目标之前将.class和.jar文件复制到新位置的方法。在实例化log4j之前,log4j.xml
仍然在static{}
块中的Java代码中复制。要使用此配置文件,我在Netbeans中添加了-P netbeans
到maven命令行参数:
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>
为ant构建XML,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>