javabus新的入口_java 入口

class 增量发包改造为 jar 包方式发布

大纲

  1. class 增量发包介绍
  2. 项目目录结构介绍
  3. jar 包方式发布落地方案


class 增量发包介绍

当前项目的迭代修复都是通过 class 增量包来发版本的

将改动的代码 class 增量打包,如下图

class 发包方式优点

  1. class 增量发布,增量包体积较小
  2. 出现问题时,可以本地打log编译后,临时替换对应 class,便于调试
  3. 可以方便的看出本地迭代包文件变动情况 (用户不太关心)


但是也存在一些问题,开发人员维护困难,主要体现在以下几个点

  1. 每次编译后需要开发人员根据变动记录,手动收集本次迭代变动 class,容易出现错漏
  2. 本地打包后,一个 class可能会生成 n 个 class 文件 (FileToolsUI$1.class,FileToolsUI$2.class); ( 在 idea 中是看不出来的,必须在目录下才能看到) 导致增量包经常出问题...
  3. 经常要维护一个稳定版本的全量基线包
  4. 由于是 class 增量升级,误打包或重构删除的类,客户那边依旧会冗余,不利于重构; (而当前项目代码臃肿,项目亟需重构 很多java文件代码量的比较大 3k,5k,7k代码; )

于是大家商量一下想改变升级包提供方式,通过提供全量可 jar 包升级

项目目录结构介绍

项目工程结构如下

KingDomFileToolCombine
	java 源代码
	resources  资源目录1
	source   资源目录 2
	doc  文档
	lib 外部依赖 jar 包存放目录

由于早期项目没有使用构建工具,当初导入项目也是花了些时间;

具体可以查看 idea 导入并配置非标准maven工程


jar 包方式发布落地方案

改造后要求满足以下需求

  1. 当前项目 jar包形式发布
  2. 外部依赖单独存放在 lib目录下 (减少升级包体积)
  3. 配置文件单独存放在jar包的同级目录的bin目录下 (方便用户调整配置)


使用 maven 打 jar'包方案实现步骤如下

  1. 添加 pom.xml 使用 maven 管理依赖
  2. 使用 maven 管理本地 jar 包
  3. 选择maven构建插件,打 jar 包
  4. 刷新 maven 依赖; (最好是手动删除 project structure中的依赖,然后刷新maven)
  5. mvn clean package 打 jar 包
  6. 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;
    }


项目问题每天不重样,遇到问题解决问题, 调整升级方式为后续代码重构做铺垫

原文链接:,转发请注明来源!