3

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

有没有人见过这个?

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

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

这是一个不使用<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 构建),但我希望尽可能多地保留在描述符文件中。

4

2 回答 2

0

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

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

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

于 2012-04-12T23:30:08.980 回答
0

有一种简单的方法可以解决这个问题,只需包含您想要的目录或“**/”,如果您想要所有这些,例如:

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

注意尾随的 / 因为那是拉入目录的东西。我认为当前的行为可能是故意的,因为 include 似乎准确地引入了您所包含的内容,而不是其他任何内容。顺便说一句,虽然生成的 tarball 不满足 npm,所以 maven 的支持似乎仍然有点可疑。

于 2016-08-11T18:19:49.060 回答