18

改訂された質問(以下の古い質問):

問題: Maven を使用して NetBeans で Jenkins プラグイン プロジェクトをビルドして実行すると、log4j で使用されるJava クラス ローダーが一部のファイル (構成ファイル、カスタム アペンダー、JDBC ドライバーなど) を検出しません。の下の別の場所にコピーする必要がありtargetます。

私が望む解決策は次のとおりです。NetBeansで構成された追加のコマンドライン引数をmavenに与えたいですこれにより、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
  • またはC:\log4j\log4j.xmlようなターゲットディレクトリ以外の場所にあるlog4j.xml
  • または、maven および/または netbeans を作成して、現在見つかっている場所にlog4j.xmlをコピーします。
  • または、NB でデバッグするときに、プラグインlog4j.xmlを clean&build 後に自動的に提供できるようにする他の良い方法はありますか?
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これは、目標を実行する前に.classおよび.jarファイルを新しい場所にコピーするようにmavenを取得した方法です。log4jをインスタンス化する前に、ブロック内のlog4j.xmlJavaコードにまだコピーされています。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 に答える