2012-04-30 13 views
2

mavenでリリースするときにjarファイルに含まれるリソースに関する問題があります。リリース中に未追跡のリソースがMavenでコピーされない

私は自分のプロジェクトをビルドするMavenを使用していると私は

$ mvn package 

を実行するとリソースが出力JARに含まれています。しかし、私が走るとき

$ mvn release:prepare 

$ mvn release:perform 

これらのリソースはリリースジャーに含まれていません。

リソースは、デフォルトのディレクトリmavenのsrc/main/resourcesにありますが、ソース管理の外にあります(.gitignoreで無視されます)。 mavenの出力から、mavenは別のフォルダにgit checkoutを行い、リソースはそのフォルダにコピーされません。 これは、maven releaseプラグインがjarをリリースするためにパッケージ化しない理由です。

私の質問は、このような場合に対処する最善の方法は何ですか?

  1. リリースプロセス中にリソースフォルダのシンボリックリンクを作成しますか?どうやって?

  2. どうやって?

  3. リソースをSCMに入れることは、リリースされたパッケージでリソースを利用できる唯一の方法ですか?

私はこのために小さなテストケースを準備:彼らはあなたのプロジェクトの一部である原因

#!/bin/sh 
# here is pom.xml 
cat >pom.xml <<EOF 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.domain</groupId> 
    <artifactId>artifact</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>artifact</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <scm> 
    <developerConnection>scm:git:file://$(pwd)</developerConnection> 
    </scm> 

    <distributionManagement> 
    <repository> 
     <id>internal.repo</id> 
     <name>Example Internal Repository</name> 
     <url>file://$(pwd)/deploy</url> 
    </repository> 
    </distributionManagement> 

</project> 
EOF 

#here is src/main/java/Main.java 
mkdir src 
mkdir src/main 
mkdir src/main/java 
mkdir src/main/resources 

cat >src/main/java/Main.java <<EOF 
import java.io.InputStream; 

public class Main 
{ 
    public static void main(String args[]) 
    { 
     boolean ok = false; 
     InputStream is = new Main().getClass().getResourceAsStream("/some_file_outside_scm"); 
     ok = is != null; 

     System.out.println("ok=" + ok); 
    } 
} 
EOF 

#some data in src/main/resources/some_file_outside_scm 
cat >src/main/resources/some_file_outside_scm <<EOF 
123 
456 

EOF 

#file src/main/resources/.gitignore 
cat >src/main/resources/.gitignore <<EOF 
some_file_outside_scm 
EOF 


#.gitignore in the project root 
cat >.gitignore <<EOF 
target 
deploy 
EOF 

git init . 
git add pom.xml 
git add src/main/java/Main.java 
git commit -m "first commit" 

#The test case can be tested with these commands 

mvn package 
echo !!!!!!!!!!!!!!!!! 
echo contents of the packaged jar 
jar tf target/artifact-0.0.1-SNAPSHOT.jar 
#The file 'some_file_outside_scm' is packaged into jar. 

echo !!!!!!!!!!!!!!!!! 
echo after mvn package 
java -cp target/artifact-0.0.1-SNAPSHOT.jar Main 
# ok=true 
echo !!!!!!!!!!!!!!!!! 

mvn release:prepare 
mvn release:perform 

echo !!!!!!!!!!!!!!!!! 
echo but after mvn release 
java -cp deploy/com/domain/artifact/0.0.1/artifact-0.0.1.jar Main 
# ok=false 

#the file is not included in the release jar 
echo !!!!!!!!!!!!!!!!! 
echo contents of the release jar 
jar tf deploy/com/domain/artifact/0.0.1/artifact-0.0.1.jar 
+0

リリースしたいSCMにないこれらのリソースは何ですか?ソースからのみプロジェクトを構築できない場合、繰り返し可能なビルドが難しくなることはわかっていますか? – artbristol

+0

バージョン管理下のリソースがsrc/main/resourcesにない理由を説明できますか? – khmarbaise

+0

リソースがSCMで追跡されなかったのは、特定のプロジェクトでリソースが大きくて外部にあるためです。言い換えると、そのようなリソースの変化は外部的に追跡されます。 – sancoder

答えて

0

リソースをSCMに入れない場合は、他の人の言葉通り、リソースをSCMの一部として解放することはできません。

リソースを別のプロジェクトに移動し、maven-remote-resources-plugin:bundleを使用してリソースバンドル(jar)を構築してみてください。そのプロジェクト内のリソースを変更するときはいつでも、あなたのPOMのバージョン番号を手作業でバンプしてmvn deployを実行して、アーティファクトリポジトリに変更を加える必要があります。

あなたの現在のプロジェクトでは、maven-remote-resources-plugin:processを使用してリソースを取得し、それらをビルドする前にアーティファクトの適切な場所に配置します。 processはデフォルトでgenerate-resourcesフェーズにバインドされています。ニーズに合わせて調整してください。

+0

唯一のオプションがある場合、私はこの答えを受け入れます。リソースが別のプロジェクトにある可能性があることを指摘してくれてありがとう。 – sancoder

0

リソースは、あなたのSCMでなければなりません。さもなければあなたのプロジェクトはどんなリソースでも動作しません。したがって、残りのプロジェクトとしてsrc/main/resourcesにバージョン管理されていないので、決してjarファイルにパッケージ化されません。

0

放出プラグインは、release:performのプロファイルrelease-performの間に活性化する。そのプロファイルのresource-pluginを使用してリソースをコピーできます。

関連する問題