2

私の問題は、Mavenでリリースを行うときにjarファイルに含まれるリソースに関するものです。

プロジェクトのビルドにMavenを使用しており、実行すると

$ mvn package

リソースは出力jarに含まれています。しかし、私が走るとき

$ mvn release:prepare

$ mvn release:perform

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

リソースはmavenのデフォルトディレクトリにありますsrc/main/resourcesが、ソース管理の範囲外です(を介して無視され.gitignoreます)。mavenによって作成された出力から、mavenは別のフォルダーにgit checkoutを実行し、リソースはそのフォルダーにコピーされないことがわかります。これが、mavenリリースプラグインが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
4

3 に答える 3

0

他の人が述べているように、リソースをSCMに入れていない場合、このプロジェクトの一部としてリソースをリリースすることはできません。

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

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

于 2012-04-30T14:54:13.703 に答える
0

リソースはSCMに含まれている必要があります。これは、リソースがプロジェクトの一部であるためです。そうしないと、プロジェクトはこれらのリソースが何であれ機能しません。したがって、それらを残りのプロジェクトとしてsrc / main / resourcesにバージョン管理下に置かないでください。そうすれば、それらはjarにパッケージ化されることはありません。

于 2012-04-30T08:50:49.863 に答える
0

release:performリリースプラグインは、プロファイル中にアクティブになりますrelease-perform。そのプロファイルのresource-pluginを使用して、リソースをコピーできます。

于 2014-01-05T19:03:49.557 に答える