我的问题是在使用maven发布时要包含在jar文件中的资源。
我正在使用maven来构建我的项目,当我运行时
$ mvn package
资源包含在输出jar中。但是当我跑步时
$ mvn release:prepare
$ mvn release:perform
这些资源不包含在发布jar中。
资源位于maven默认目录src/main/resources
中,但它们不在源代码管理之内(通过.gitignore
忽略)。
从maven的输出中我意识到maven将git checkout发送到不同的文件夹,资源不会复制到该文件夹。
这就是为什么maven发布插件不会将其打包以释放jar。
我的问题是处理这种情况的最佳方法是什么?
在发布过程中为资源文件夹创建符号链接?怎么样?
复制资源?怎么样?
或者将资源放入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 :(得分:0)
资源必须在您的SCM中,因为它们是您项目的一部分。否则,无论这些资源是什么,您的项目都将无效。因此,您不要将它们作为其余项目置于src / main / resources的版本控制之下,因此它们永远不会被打包到jar中。
答案 1 :(得分:0)
如果您没有将资源投入SCM,则无法将其作为此项目的一部分发布,如其他人所述。
您可以尝试将资源移动到单独的项目中,并使用maven-remote-resources-plugin:bundle
构建资源包(jar)。每当您更改该项目中的资源时,您都需要手动删除POM中的版本号并执行mvn deploy
以更改工件仓库中的更改。
然后,在当前项目中,使用maven-remote-resources-plugin:process
检索资源,并在构建之前将它们放在工件中的适当位置。 process
默认绑定到generate-resources
阶段;调整这个以满足您的需求。
答案 2 :(得分:0)
发布插件会在release:perform
个人资料release-perform
期间激活。您可以使用该配置文件的资源插件来复制资源。