1

前言

哪些文件是有用的需要打到jar包中呢?
在运行java -jarjava -cp等命令时,会出现没有主清单属性,这往往是没有打进依赖或依赖路径不对。

案例分析

我们使用前文中的案例。

1. 自带的jar-with-dependencies

先看一下使用 <descriptorRef>jar-with-dependencies</descriptorRef>自带的打进依赖的配置,打成的jar解压后的文件:

clipboard.png

分析:
上述文件中,核心代码和依赖包都放在根目录下(见org/...
查看MANIFEST.MF:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Class-Path: log4j-1.2.17.jar ant-1.9.1.jar ant-launcher-1.9.1.jar
Created-By: Apache Maven 3.5.4
Build-Jdk: 1.8.0_171
Main-Class: org.mybatis.generator.api.ShellRunner

有Main-Class入口和Class-Path依赖。直接使用:
ava -jar mybatis-generator-modify.jar -configfile generatorConfig.xml
即可运行。

其他:一起生成的无依赖jar

跟随有依赖jar一起生成的无依赖jar,其MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.5.4
Build-Jdk: 1.8.0_171

其无入口也无依赖包。

clipboard.png

2. 使用assembly.xml配置打包

pom中使用配置文件,且此时主入口配置失效(查原因)。

<descriptors>
     <descriptor>src/assembly/assembly.xml</descriptor>
</descriptors>

assembly.xml中核心配置:

<id>distribution</id>

    <formats>
        <format>dir</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <excludes>
                <exclude>${project.groupId}:${project.artifactId}</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.groupId}:${project.artifactId}</include>
            </includes>
        </dependencySet>
    </dependencySets>

mybatis-generator-modify-distribution文件夹下,生成的文件如下:

clipboard.png
其中jar中的内容如下:

clipboard.png
MANIFEST.MF文件无依赖也无入口
使用命令即可执行:

java -cp mybatis-generator-modify-1.0-SNAPSHOT.jar:./lib/* org.mybatis.generator.api.ShellRunner -configfile ../generatorConfig.xml

运行时,指出依赖和入口。

3. 其他配置说明

关于dependencySets标签

<dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <!--<excludes>-->
                <!--<exclude>${project.groupId}:${project.artifactId}</exclude>-->
            <!--</excludes>-->
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <!--<includes>-->
                <!--<include>${project.groupId}:${project.artifactId}</include>-->
            <!--</includes>-->
        </dependencySet>
    </dependencySets>

dependencySets不配includesexcludes时,默认包含主模块依赖包两块。如上述配置,如注释掉includes和excludes,将会在打包后的根目录下和/lib目录下,生成完全一样的主包和依赖。

clipboard.png

因此,上述配置的excludesincludes时必须的。

4. 将脚本等配置也打包进来

我们将启动脚本放在

src
 |-shell
     |-startup.sh
     |-config
         |-generatorConfig.xml

我们将其一并打包:

    <!--<dependencySets>等其他配置...-->
    
    <fileSets>
        <fileSet>
            <directory>src/shell</directory>
            <outputDirectory>/shell</outputDirectory>
            <fileMode>755</fileMode>
        </fileSet>
    </fileSets>

并赋予755权限。

shartup.sh:

java -cp \
../mybatis-generator-modify-1.0-SNAPSHOT.jar:./lib/* \
org.mybatis.generator.api.ShellRunner \
-configfile ./config/generatorConfig.xml

王小禾
99 声望6 粉丝

public class Myself {


引用和评论

0 条评论