Maven在发布时不会复制未跟踪的资源

时间:2012-04-30 05:02:13

标签: git maven release

我的问题是在使用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是在已发布的软件包中使用它们的唯一方法吗?

  4. 我为此准备了一个小测试用例:

    #!/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
    

3 个答案:

答案 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期间激活。您可以使用该配置文件的资源插件来复制资源。