18

修订后的问题(下面的旧问题):

问题:使用 Maven 在 NetBeans 中构建和运行 Jenkins 插件项目时,log4j 使用的Java 类加载器找不到某些文件(如配置文件、自定义附加程序、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 中进行 clean&build 时,它会被复制到这些地方:

./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添加到该 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复制到现在可以找到的位置
  • 或任何其他好方法让我在使用 NB 调试时自动清理和构建后提供我的插件log4j.xml ?
4

4 回答 4

12

您可以使用Maven Ant 插件来运行执行复制的 Ant 脚本,或者使用Maven 资源插件,这似乎针对您将内容复制到输出目录的确切用例。

另请注意,您可以按照此处所述参数化您的构建(忽略该标题的 Jenkins 部分,答案与一般 Maven 用法有关)。

于 2012-12-18T01:58:33.347 回答
7

您可以在配置文件中使用此插件

<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

于 2012-12-17T10:10:05.937 回答
3

您可以使用复制工件插件。就像在哈德逊一样。

于 2012-12-18T18:56:59.480 回答
2

hpi:run这就是我如何让 maven 在执行目标之前将 .class 和 .jar 文件复制到新位置。在实例化 log4j 之前,log4j.xml它仍然被复制到我的 Java 代码中。static{}为了使用这个配置文件,我-P netbeans在 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>
于 2012-12-19T13:11:10.817 回答