大纲
- class 增量发包介绍
- 项目目录结构介绍
- jar 包方式发布落地方案
class 增量发包介绍
当前项目的迭代修复都是通过 class 增量包来发版本的
将改动的代码 class 增量打包,如下图
class 发包方式优点
- class 增量发布,增量包体积较小
- 出现问题时,可以本地打log编译后,临时替换对应 class,便于调试
- 可以方便的看出本地迭代包文件变动情况 (用户不太关心)
但是也存在一些问题,开发人员维护困难,主要体现在以下几个点
- 每次编译后需要开发人员根据变动记录,手动收集本次迭代变动 class,容易出现错漏
- 本地打包后,一个 class可能会生成 n 个 class 文件 (FileToolsUI$1.class,FileToolsUI$2.class); ( 在 idea 中是看不出来的,必须在目录下才能看到) 导致增量包经常出问题...
- 经常要维护一个稳定版本的全量基线包
- 由于是 class 增量升级,误打包或重构删除的类,客户那边依旧会冗余,不利于重构; (而当前项目代码臃肿,项目亟需重构 很多java文件代码量的比较大 3k,5k,7k代码; )
于是大家商量一下想改变升级包提供方式,通过提供全量可 jar 包升级
项目目录结构介绍
项目工程结构如下
KingDomFileToolCombine
java 源代码
resources 资源目录1
source 资源目录 2
doc 文档
lib 外部依赖 jar 包存放目录
由于早期项目没有使用构建工具,当初导入项目也是花了些时间;
具体可以查看 idea 导入并配置非标准maven工程
jar 包方式发布落地方案
改造后要求满足以下需求
- 当前项目 jar包形式发布
- 外部依赖单独存放在 lib目录下 (减少升级包体积)
- 配置文件单独存放在jar包的同级目录的bin目录下 (方便用户调整配置)
使用 maven 打 jar'包方案实现步骤如下
- 添加 pom.xml 使用 maven 管理依赖
- 使用 maven
管理本地 jar 包 - 选择maven构建插件,打 jar 包
- 刷新 maven 依赖; (最好是手动删除 project structure中的依赖,然后刷新maven)
- mvn clean package 打 jar 包
- cd 到目录下 java -jar xxx.jar 启动应用
pom,xml 配置如下:
com.szkingdom.filetool
KingDomFileToolCombine
V3.
jar
7
7
.RELEASE
org.dom4j
dom4j
system
${project.basedir}/lib/dom4j-.jar
bouncycastle
bcprov-jdk15
system
${project.basedir}/lib/bcprov-jdk15-.jar
local
chinapnr
localversion
system
${project.basedir}/lib/chinapnr.jar
org.springframework
spring-beans
${spring.version}
system
${project.basedir}/lib/spring-beans-.RELEASE.jar
kingDomFileToolCombine
java
source
bin
bin
resources
source
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
package
copy-dependencies
jar
jar
out/lib
org.apache.maven.plugins
maven-jar-plugin
false
com.szkingdom.FileTools.UI.FileToolsSurface
true
lib/bcprov-jdk15-.jar lib/cipher-localversion.jar
out
*.jar
打包启动 jar 后报错记录解决
mvn clean package 打包 后 cd 到 jar 所在目录 java -jar 启动程序
#### Error assembling JAR: A zip file cannot include itself
- 装配JAR错误:zip文件不能包含自身
```asp
*.jar
```
#### java -jar 运行程序报错, java.lang.NoClassDefFoundError
- java.lang.NoClassDefFoundError 找不到外部依赖的 jar
- 解决:
- 1 打包时插件配置
- 2 需要将 lib 目录放到 jar同级别目录
#### java -jar 运行程序报错, java.lang.Error: Properties init: Could not determine current working directory.
- 原因: 找不到当前所在目录; 每次重新 mvn clear package 时 ,旧的命令行窗口所在目录已经被清除了
- 解决: 重新 cd 到 jar 目录 运行 java -jar
代码改造,之前读取 classpath 下的配置,改造为从 jar 包外文件中读取
//编写配置文件加载工具类
public class ConfigFileUtil {
/**
* 文件分割路径 ,mac windows 适配
*/
public final static String PATH_SPLIT = File.separator;
private static String CONFIG_FILE_PATH;
static {
//System.out.println(" 相对于当前用户目录的相对路径 user.dir :" + System.getProperty("user.dir"));
//获取当前 jar 包路径 .....jar
String jarFilePath = FileUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath();
System.out.println(" jar文件所在路径为 :" + jarFilePath);
try {
jarFilePath=URLDecoder.decode(jarFilePath, "utf-8");// 转化为utf-8编码,支持中文
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
File file = new File(jarFilePath);
CONFIG_FILE_PATH = file.getParent();
System.out.println(" 配置文件所在路径为 :" + CONFIG_FILE_PATH);
}
public static String getFileAbsolutePath(String underBinPath) {
String filePath = "";
if (underBinPath.startsWith("bin")) {
filePath = FileUtil.CONFIG_FILE_PATH + FileUtil.PATH_SPLIT + underBinPath;
} else {
filePath = FileUtil.CONFIG_FILE_PATH + FileUtil.PATH_SPLIT + "bin" + FileUtil.PATH_SPLIT + underBinPath;
}
System.out.println(" 配置文件所在绝对路径为 :" + filePath);
return filePath;
}
/**
* @param underBinPath 存放在 /src/main/resources/bin 下的相对路径
* @return
*/
public static FileInputStream getConfigFileInputStream(String underBinPath) {
FileInputStream is = null;
try {
String fileAbsolutePath = getFileAbsolutePath(underBinPath);
is = new FileInputStream(fileAbsolutePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return is;
}
public static FileOutputStream getConfigFileOutPutStream(String underBinPath) {
FileOutputStream os = null;
try {
String fileAbsolutePath = getFileAbsolutePath(underBinPath);
os = new FileOutputStream(fileAbsolutePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return os;
}
项目问题每天不重样,遇到问题解决问题, 调整升级方式为后续代码重构做铺垫