文章目录
- 1 场景
- 1.1 功能
- 1.2 特性
- 1.3 依赖maven插件
- 2 实现
- 2.1 代码目录结构
- 2.2 文件说明
- 2.3 打包可执行文件
- 3 获取项目相对路径
- 3.1 输出文件到项目相对路径
- 3.2 输出日志文件
- 3.3 读取外部配置文件
1 场景
1.1 功能
通过maven名称生成可执行jar。
1.2 特性
(1)jar可读取外部配置文件
(2)生成doc、执行脚本文件
(3)打包时生产环境配置文件替换开发配置文件
1.3 依赖maven插件
(1)maven-jar-plugin
(2)maven-assembly-plugin
2 实现
2.1 代码目录结构
项目名称:mysql-doc,用于生成mysql数据库表结构到excel
src
-main
-config
-assembly
-package.xml //[2]
-doc
-生成mysql表结构文档.txt
-proConfig
-log4j.properties
-mysql.properties
-scropts
-start.bat
-start.sh
-java
-com.ext.sjckall.mysql.doc.main
-MainExec //[3]
-resources
-log4j.properties
-mysql.properties
-pom.xml //[1]
2.2 文件说明
[1]pom.xml文件配置maven插件
<build>
<finalName>mysql-doc</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--是否要把第三方jar放到manifest的classpath中-->
<addClasspath>true</addClasspath>
<!--生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/-->
<classpathPrefix>lib/</classpathPrefix>
<!--运行jar包时运行的主类,要求类全名-->
<mainClass>com.ext.sjckall.mysql.doc.main.MainExec</mainClass>
</manifest>
<!-- classPath下增加目录 -->
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<!--过滤掉不希望包含在jar中的文件-->
<excludes>
<!-- 排除不需要的文件夹(路径是jar包内部的路径) -->
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<!-- 对项目的组装进行配置 -->
<configuration>
<!-- 指定assembly插件的配置文件所在位置 -->
<descriptors>
<descriptor>src/main/config/assembly/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- 将组装绑定到maven生命周期的哪一阶段 -->
<!--<phase>package</phase>-->
<goals>
<!-- 指定assembly插件的打包方式, -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[2]package.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>full</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- 把依赖jar包打包进Zip压缩文件的lib目录下 -->
<dependencySets>
<dependencySet>
<!--不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录-->
<useProjectArtifact>false</useProjectArtifact>
<!-- 第三方jar打包进Zip文件的lib目录下,注意此目录要与maven-jar-plugin中classpathPrefix指定的目录相同,不然这些依赖的jar包加载到ClassPath的时候会找不到 -->
<outputDirectory>lib</outputDirectory>
<!-- 第三方jar不要解压-->
<!--<unpack>false</unpack>-->
</dependencySet>
</dependencySets>
<!-- 文件设置,你想把哪些文件包含进去,或者把某些文件排除掉,都是在这里配置-->
<fileSets>
<!-- 把项目自己编译出来的可执行jar,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<!-- 生产配置文件 -->
<fileSet>
<directory>src/main/config/proConfig</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
<!-- 执行脚本目录 -->
<fileSet>
<directory>src/main/config/scripts</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
<!-- 说明文档目录 -->
<fileSet>
<directory>src/main/config/doc</directory>
<outputDirectory>doc</outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
[3]程序入口文件MainExec
public class MainExec {
private static final Logger LOG=Logger.getLogger(MainExec.class);
public static void main(String[] args) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
LOG.info("[生成mysql文档]开始时间:"+dateFormat.format(new Date()));
ExecMysqlToDoc.mainMethod();
LOG.info("[生成mysql文档]结束时间:"+dateFormat.format(new Date()));
}
}
2.3 打包可执行文件
项目根目录下执行如下命令:
(1)编译项目
mvn clean install
(2)打包文件
mvn assembly:single
打包后生成文件:mysql-doc-full.zip,文件目录如下:
mysql-doc
-doc
-生成mysql表结构文档.txt
-lib
-*.jar
-log4j.properties
-mysql.properties
-mysql-doc.jar
-start.bat
-start.sh
整理后端bat脚本如下:
C:
echo [1、项目编译]
cd C:\work\ideaWsAll\trunkPro\sjckend
call mvn clean install
pause
echo [2、打包文件]
cd C:\work\ideaWsAll\trunkPro\sjckend\mysql-doc
call mvn assembly:single
pause
echo [3、复制文件]
xcopy /y /c /h /r "C:\work\mysql-doc\target\mysql-doc-full.zip" "D:\myData"
3 获取项目相对路径
3.1 输出文件到项目相对路径
项目运行期间,会输出相关文件到执行文件绝对路径
下,采用此种方式获取执行jar的绝对路径。参数为执行代码的class。
/**
* 获取执行jar路径
* @return
*/
private static String getJarUrl(Class<?> clazz){
String filePath=clazz.getProtectionDomain().getCodeSource().getLocation().getPath();
try {
//转换处理中文及空格
filePath = URLDecoder.decode(filePath, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//可执行jar包运行的结果里包含".jar"
if (filePath.endsWith(".jar")) {
//截取路径中的jar包名
filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
}
return filePath;
}
如需要将项目结果输出到执行jar平级的文件夹内,可以采用以下方式获取文件夹绝对路径:
/**
* 获取执行输出目录
* @return
*/
public static String getJarOutUrl(Class<?> clazz){
String filePath=getJarUrl(clazz);
filePath=filePath+"out/";
File file=new File(filePath);
if(!file.exists()){
file.mkdirs();
}
return filePath;
}
3.2 输出日志文件
如需要将日志输出到执行jar的平级文件夹logs中,log4j.properties采用如下配置:
log4j.appender.result=org.apache.log4j.DailyRollingFileAppender
log4j.appender.result.Threshold=INFO
log4j.appender.result.file=./logs/result.log
log4j.appender.result.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.result.layout=org.apache.log4j.PatternLayout
log4j.appender.result.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [ %l ] - [ %p ]: %m%n
log4j.appender.result.Append=true
log4j.appender.result.encoding=UTF-8
3.3 读取外部配置文件
读取外部properties配置文件,可采用如下方式:
Properties properties = new Properties();
properties.load(MysqlConfigContent.class.getClassLoader().getResourceAsStream("./mysql.properties"));