Maven程序集插件没有用目录条目创建tar文件?

时间:2012-04-10 22:07:22

标签: java maven tar

我正在开发我的第一个Maven项目,该项目最终将在Debian软件包中打包Java应用程序(使用jdeb插件)。我试图使用程序集插件来构建tar文件,但看起来生成的文件并不总是包含目录条目,这将导致dpkg安装失败。

有没有人见过这个?

具体而言,生成的tar文件不包含以下目录条目:

  • 指定<includes>的文件集(离开<includes>将导致tar文件中的目录条目)
  • 一个dependencySet

这是一个不使用<includes>

的汇编文件
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>simple</id>
<formats>
    <format>tar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>

<moduleSets>
</moduleSets>
<fileSets>
    <fileSet>
        <directory>src/main/config</directory>
        <outputDirectory>/etc/${project.artifactId}</outputDirectory>

    </fileSet>
</fileSets>

<dependencySets>

    <dependencySet>
        <outputDirectory>/usr/lib/${project.artifactId}/lib</outputDirectory>
        <scope>runtime</scope>
        <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>

</dependencySets>
<repositories>
</repositories>
<componentDescriptors />
</assembly>

以下是tar文件的内容:

 tar tvf assembly-test-0.0.1-SNAPSHOT-simple.tar
drwxr-xr-x 0/0               0 2012-04-10 12:54 etc/assembly-test/
-rw-r--r-- 0/0               0 2012-04-10 12:52 etc/assembly-test/file1.xml
-rw-r--r-- 0/0               0 2012-04-10 12:52 etc/assembly-test/file2.xml
-rw-r--r-- 0/0            2131 2012-04-10 13:26 usr/lib/assembly-test/lib/assembly-test-0.0.1-SNAPSHOT.jar

现在,如果我使用包含某些包含模式的程序集:

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>include-match</id>
<formats>
    <format>tar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>

<moduleSets>
</moduleSets>
<fileSets>
    <fileSet>
        <directory>src/main/config</directory>
        <outputDirectory>/etc/${project.artifactId}</outputDirectory>
        <includes>
            <include>*.xml</include>
        </includes>
    </fileSet>
</fileSets>

<dependencySets>

    <dependencySet>
        <outputDirectory>/usr/lib/${project.artifactId}/lib</outputDirectory>
        <scope>runtime</scope>
        <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>

</dependencySets>
<repositories>
</repositories>
<componentDescriptors />
</assembly>

tar文件的内容丢失了目录条目:

tar tvf assembly-test-0.0.1-SNAPSHOT-include-match.tar
-rw-r--r-- 0/0               0 2012-04-10 12:52 etc/assembly-test/file1.xml
-rw-r--r-- 0/0               0 2012-04-10 12:52 etc/assembly-test/file2.xml
-rw-r--r-- 0/0            2131 2012-04-10 13:26 usr/lib/assembly-test/lib/assembly-test-0.0.1-SNAPSHOT.jar

这似乎是程序集插件中的一个错误,尽管我还在尝试它。我当然可以解决它(在包中使用preinst脚本,可能构建一个jdeb的目录结构来构建),但是我喜欢在描述符文件中保留尽可能多的内容。

2 个答案:

答案 0 :(得分:0)

想想我可以通过一种方法来解决这个问题,这种方法可以强制在tar文件中创建目录条目(我实际上在其他地方找到了这个,但是不记得在哪里) - 添加文件集同时排除所有内容,例如:

        <!-- force entry for /usr/lib/${project.artifactId} -->
        <fileSet>
            <directory></directory>
            <outputDirectory>/usr/lib/${project.artifactId}</outputDirectory>
            <excludes>
                <exclude>*/**</exclude>
            </excludes>
        </fileSet>

不优雅,如果你有很多目录就会变得冗长,但它有效。但是对于我创建debian包的具体情况,我最终使用Assembly插件来构建一个“目录”格式程序集,然后让jdeb插件使用目录结构(并设置文件模式),最后得到了一些总体上更简单。

答案 1 :(得分:0)

有一种解决此问题的简单方法,只需包含您想要的目录或&#34; ** /&#34;如果你想要所有这些,例如:

<include>mydir/**/</include>

请注意尾随/作为拉入目录的东西。我认为当前的行为可能是有意的,因为包含似乎准确地包含了你所包含的内容而没有其他内容。顺便说一句,虽然由此产生的tarball不满足npm,所以maven的支持似乎仍然有点怀疑。