用代码更新你的jar包

 更新时间:2014年01月22日 09:07:05   作者:  
这篇文章主要介绍了用程序代码更新com目录下的所有文件到jar的对应目录结构中去,这样可以做到自动更新程序吧

假设目录结构是maven标准结构

复制代码 代码如下:

-src
-target
-test.jar(你需要更新的jar包)

复制代码 代码如下:

package com.foo.common.base.utils.development;

import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;

public class JarUpdater {
 public static final Logger logger = LoggerFactory
   .getLogger(JarUpdater.class);

 @Test
 /**
  * 更新com目录下的所有文件到jar的对应目录结构中去
  *
  * 一次成功的代码更新,我们断言jar的大小是不一样的
  */
 public void updateClass() throws IOException, InterruptedException {

  ClassPathResource myPath = new ClassPathResource(
    "jarUpdaterConfig.properties");
  Properties p = new Properties();
  p.load(myPath.getInputStream());

  ClassUpdater classUpdater = new ClassUpdater().applySettings(p);

  classUpdater.compileAndCopyClass();

  String workingDirectory = p.getProperty("workingDirectory");
  String jar4UpdateName = p.getProperty("jar4UpdateName");
  // class compile path
  String updateSourcePath = workingDirectory + "target";
  // class root folder
  String updateSourceDir = "com";

  Date startDate = new Date();

  File myJar = new File(workingDirectory + jar4UpdateName);
  if (!myJar.isFile()) {
   logger.error("file with following path {} does not exist.",
     jar4UpdateName);
   return;
  }
  long oldLength = myJar.length();
  logger.info("Now ready to update jar file with name:{},size:{}",
    myJar.getName(), myJar.length());
  String myCommand = "jar uf " + workingDirectory + jar4UpdateName
    + " -C " + updateSourcePath + " " + updateSourceDir;
  logger.info("Update command【{}】", myCommand);

  Runtime.getRuntime().exec(myCommand);

  while (!FileUtils.isFileNewer(myJar, startDate)) {
   logger.info("sleep for two seconds,checking changes...");
   Thread.sleep(2000);
  }
  assertNotEquals(
    "jar may not be updated successfully,check the code please",
    oldLength, myJar.length());
  logger.info("Now finish update jar file with size:{}", myJar.length());
 }
}

相关文章

  • 详细聊聊SpringBoot中动态切换数据源的方法

    详细聊聊SpringBoot中动态切换数据源的方法

    在大型分布式项目中,经常会出现多数据源的情况,下面这篇文章主要给大家介绍了关于SpringBoot中动态切换数据源的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • Java线程间协作wait、notify和notifyAll详解

    Java线程间协作wait、notify和notifyAll详解

    这篇文章主要介绍了Java线程间协作wait、notify和notifyAll详解,在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信,尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单,,需要的朋友可以参考下
    2023-10-10
  • mybatis自动填充时间字段示例代码

    mybatis自动填充时间字段示例代码

    这篇文章主要给大家介绍了关于mybatis自动填充时间字段的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

    Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

    这篇文章主要为大家详细介绍了Java语言实现简单FTP软件,FTP本地文件管理模块的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 新版本Spring中lombok失效的问题解决

    新版本Spring中lombok失效的问题解决

    Lombok是一个Java库,通过添加注解简化代码编写,本文主要介绍了新版本Spring中lombok失效的问题解决,感兴趣的可以了解一下
    2025-01-01
  • JavaSE经典小练习项目之拷贝文件夹

    JavaSE经典小练习项目之拷贝文件夹

    文件拷贝是一个常见的任务,无论是备份文件,还是将文件从一个位置复制到另一个位置,文件拷贝都是必不可少的,这篇文章主要给大家介绍了关于JavaSE经典小练习项目之拷贝文件夹的相关资料,需要的朋友可以参考下
    2023-10-10
  • Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解

    Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解

    这篇文章主要介绍了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解,读写锁:一个资源能够被多个读线程访问,或者被一个写线程访问但是不能同时存在读写线程,需要的朋友可以参考下
    2024-01-01
  • SpringBoot 如何整合 ES 实现 CRUD 操作

    SpringBoot 如何整合 ES 实现 CRUD 操作

    这篇文章主要介绍了SpringBoot 如何整合 ES 实现 CRUD 操作,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • java保留小数的四种实现方法

    java保留小数的四种实现方法

    这篇文章主要为大家详细介绍了java保留小数的四种实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • SpringBoot的@EnableAsync和@Async注解分析

    SpringBoot的@EnableAsync和@Async注解分析

    这篇文章主要介绍了SpringBoot的@EnableAsync和@Async注解分析,Spring Boot是一个快速开发框架,可以帮助开发人员快速构建基于Spring的应用程序,需要的朋友可以参考下
    2023-07-07

最新评论