Maven Assembly 到 tar 个文件的组合

Maven Assembly to tar a combination of files

我正在使用以下汇编文件生成一个 jar 文件:

<assembly>
    <id>job</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>false</unpack>
            <scope>runtime</scope>
            <outputDirectory>lib</outputDirectory>
            <excludes>
                <exclude>${groupId}:${artifactId}</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <outputDirectory></outputDirectory>
            <unpack>true</unpack>
            <includes>
                <include>${groupId}:${artifactId}</include>
            </includes>
        </dependencySet>
    </dependencySets>
</assembly>

我尝试将以下内容作为扩展名添加到上面,并将格式字段从 jar 更改为 tar。它只是创建了一个 tar 而不是 jar,这是没有用的。

<files>
    <file>
        <source>${project.basedir}/runConcept.sh</source>
        <outputDirectory></outputDirectory>
        <filtered>true</filtered>
        <fileMode>0755</fileMode>
        <lineEnding>unix</lineEnding>
    </file>
</files>

如何使用 jar 和 shell 脚本准备 tar 文件。所以当我 untar,它应该有一个 jar 和 shell 脚本。

如果我理解得很好,你想创建一个 tar,它将有一个脚本 runConcept.sh,在根目录下你的项目的 jar,这个 jar 将包含它的依赖项你的项目代码及其在 lib 文件夹中的依赖项。

我看到(我认为)的问题是,当您想要执行您的主 jar 时,类加载器将无法找到您的 jar 中的库,然后将无法执行它。
但如果你还想这样尝试,我会这样做。 (之后你可以找到其他解决方案)

Solution number 1...

使用从插件的 jar-with-dependencies 程序集复制的程序集文件首次执行 maven-assembly-plugin,属性 unpack 设置为 falseoutputDirectory 设置到我想要的位置,例如:

<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>jar-with-dependencies-packed</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>false</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

第二次执行 maven-assembly-plugin 将在上一次执行之后执行(否则我们将无法包含 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>job</id>
    <formats>
        <format>tar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <files>
        <file>
            <source>src/main/scripts/runConcept.sh</source>
            <outputDirectory></outputDirectory>
            <filtered>true</filtered>
            <fileMode>0755</fileMode>
            <lineEnding>unix</lineEnding>
        </file>
    </files>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/assembly-test/</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

Solution number 2...

因为我认为解决方案 1 可能行不通,所以我会创建一个经典的 jar-with-dependencies,我将把它包含在 tar with scripts 中。


Solution number 3...

因为你想要它,所以有一个名为 One-JAR 的 Maven 插件可以处理你的 jar 的构建,然后 运行 构建你的 tar 的程序集.

看那里:http://one-jar.sourceforge.net/