前言
哪些文件是有用的需要打到jar包中呢?
在运行java -jar
或java -cp
等命令时,会出现没有主清单属性,这往往是没有打进依赖或依赖路径不对。
案例分析
我们使用前文中的案例。
1. 自带的jar-with-dependencies
先看一下使用 <descriptorRef>jar-with-dependencies</descriptorRef>
自带的打进依赖的配置,打成的jar解压后的文件:
分析:
上述文件中,核心代码和依赖包都放在根目录下(见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
其无入口也无依赖包。
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
文件夹下,生成的文件如下:
其中jar中的内容如下:
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
不配includes
和excludes
时,默认包含主模块
和依赖包
两块。如上述配置,如注释掉includes和excludes,将会在打包后的根目录
下和/lib
目录下,生成完全一样的主包和依赖。
因此,上述配置的excludes
和includes
时必须的。
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。