项目改成了maven管理,现场需要用增量补丁包的形式发布代码;

2015/4/21

以前试过用ant打补丁包,现在试试maven能不能做同样的事情;

maven-assembly-plugin看着可以做这样的事情;http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package/

pom.xml配置:

            <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

assembly.xml:

<assembly>
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>README.txt</include>
</includes>
</fileSet>
<!-- <fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>/bin</outputDirectory>
<includes>
<include>run.sh</include>
<include>run.bat</include>
</includes>
</fileSet> -->
</fileSets>
</assembly>

运行maven clean package;

第一次运行要下载很多包;

看看srpm-bin.zip都有什么;

lib里边是所有依赖jar和war包;

现在要的是只打包部分class和配置,不需要打包依赖和不生成war包;

看看怎么配置:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

/controllers/HomeController*.class

配置加了通配符*,没生效;

[INFO] Reading assembly descriptor: src/main/assembly/assembly.xml

[WARNING] The following patterns were never triggered in this artifact inclusion filter:

哈哈,这里只是用fileSet就可以了;

增加一个试试:

<fileSet>

<outputDirectory>/WEB-INF/classes</outputDirectory>

<includes>

<include>target/classes/com/xxx/srpm/controllers/HomeController.class</include>

</includes>

</fileSet>

打包结果路径是:

WEB-INF\classes\target\classes\com\xxx\srpm\controllers

需要的是:

WEB-INF\classes\com\xxx\srpm\controllers

因为这样和war包的目录结构一样,升级的时候直接拖动文件夹覆盖war包里边的就可以了;

看文档貌似directory能设置基准路径;

<fileSet>

<outputDirectory>/WEB-INF/classes</outputDirectory>

<directory>target/classes/</directory>

<includes>

<include>com/xxx/srpm/controllers/HomeController.class</include>

</includes>

</fileSet>

完美!就是这样配置了;

完整的配置如下:

<assembly>
<id>upd-20150421-1</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<outputDirectory>/WEB-INF/classes</outputDirectory>
<directory>target/classes/</directory>
<includes>
<include>com/xxx/srpm/controllers/HomeController.class</include>
<include>com/xxx/srpm/activiti/DetailBuilder.class</include>
<include>com/xxx/srpm/activiti/common/HistoricProcessInstanceSQLFragment.class</include>
<include>com/xxx/srpm/activiti/query/HistoricProcessInstanceQuery.class</include>
<include>com/xxx/srpm/base/dao/BaseDao.class</include>
<include>com/xxx/srpm/base/dao/SQL.class</include>
<include>com/xxx/srpm/base/query/BaseQuery.class</include>
<include>com/xxx/srpm/base/util/BaseUtils.class</include>
<include>com/xxx/srpm/base/util/PageUtils.class</include>
<include>com/xxx/srpm/repository/activiti/HistoricProcessInstanceRepository.class</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>README.txt</include>
</includes>
</fileSet>
</fileSets>
</assembly>

再写个Helper:

/**
* assembly.xml配置工具类
* @author yejq
*/
public class AssemblyHelper { private final static String CLASS_PATH; static {
File file = new File("");
CLASS_PATH = file.getAbsolutePath();
} /**
* 将java的路径转换为class路径
*/
@Test
public void java2class(){
String path = CLASS_PATH + "/src/test/java/build/java.txt";
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(path));
String line = null;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
if (StringUtils.isNotBlank(line)) {
line = line.trim().replace("/srpm/src/main/java/", " <include>")
.replace(".java", ".class</include>");
builder.append(line).append(BaseUtils.lineSeparator);
}
}
System.out.println(builder.toString());
} catch (Exception e) {
e.printStackTrace();
}finally{
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

maven-assembly-plugin挺好用,好强大!

再加上个通配符,避免遗漏内部类;

<include>com/xxx/srpm/controllers/HomeController*.class</include>

总结:

1、解决方案很多,用哪个,究竟哪个更适合更优雅,用过才知道,或许不是最佳实践,但没试过,怎么知道是不是最佳呢?这就是架构做的事情:在解决方案之间做决策,并提供最佳实践,指导开发人员实践;

2、工作了一周,问同事有没有签合同,了解到可能是转正签,之前遇到的都是入职签,这转正签会不会有问题?

测试发布(maven-assembly-plugin看好你哦)的更多相关文章

  1. 记录一次maven打包时将test目录下的类打包到jar中,Maven Assembly Plugin的使用

    今天有人问我打包后找不到主类,运行的类写在test中.按照常规,test目录下的文件不会打包到jar包中.(但是我测试一个springboot工程就可以,这里之后再研究) 具体解决如下 第一步:在po ...

  2. maven assembly plugin使用

    使用场景 在使用maven来管理项目时,项目除了web项目,还有可能为控制台程序,一般用于开发一些后台服务的程序.最近在工作中也遇到了这种场景,使用quartz开发一个任务调度程序.程序中依赖很多ja ...

  3. 使用Maven Assembly plugin将依赖打包进jar

    一个Eclipse的工程,在pom中配置了若干依赖,需要将pom中所有的依赖全部打包进一个jar包中,可以选择的方案有maven-assembly-plugin和fatjar.以前采用fatjar进行 ...

  4. Maven Assembly插件介绍

    转自:http://blueram.iteye.com/blog/1684070 已经写得挺好的,就不用重写了. 你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembl ...

  5. maven assembly 配置详解

    Maven Assembly插件介绍 博客分类: 项目构建   你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembly插件能帮你构建一个完整的发布包. Assembl ...

  6. [原]Jenkins(七)---jenkins项目编译测试发布由maven构建的web项目

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...

  7. Gitlab+Jenkins学习之路(八)之发布maven项目及按版本发布

    一.什么是Maven maven是一个项目管理和综合工具.Maven提供给开发人员构建一个完整的生命周期框架. 开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期 ...

  8. 学习Maven之Maven Enforcer Plugin

    1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...

  9. maven jetty plugin

    转载:http://blog.163.com/xueling1231989@126/blog/static/1026408072013101311395492/ 前言: 在 maven 下测试调试时, ...

  10. 如何发布Maven依赖到中央仓库

    平时我们都是从Maven中央仓库下载依赖,如果我们想发布我们自己写的Maven依赖到中央仓库供别人下载使用应该怎么办?这里以上传自己写的simian-maven-plugin(https://gith ...

随机推荐

  1. 2010辽宁省赛F(字典树,动态规划)

    #include<bits/stdc++.h>using namespace std;int n,x;char s[10010];char a[31010];int val[100010] ...

  2. 洛谷P3694 邦邦的大合唱站队/签到题

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  3. Mac安装vue

     Mac安装vue 一.安装brew 打开终端运行以下命令: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...

  4. Hadoop集群配置免密SSH登录方法

    Hadoop集群包含1个主节点和3个从节点,需要实现各节点之间的免密码登录,下面介绍具体的实现方法. 一.Hadoop集群环境 二.免密登录原理 每台主机authorized_keys文件里面包含的主 ...

  5. php静态方法和属性

    静态方法和属性由static关键字定义 静态方法和属性不用实例化也可以直接访问,如 self::test(),self::tt 类实例化后可以访问静态方法,但是不可以访问静态属性 声明类属性或方法为静 ...

  6. 原生JS轮播-各种效果的极简实现(二)面向对象版本的实现和优化

    之前写了一篇原生JS轮播,不过是非面向对象的,并且也没有添加上自动轮播.这里来写一下如何优化和进阶. 这里简单地介绍一下之前的代码,这是html结构 <body> <div clas ...

  7. HDU-2588-GCD (欧拉函数)

    The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the ...

  8. spring boot中ConditionalOnClass为什么没有classNotFound类加载异常

    查看原码时有很多飘红的地方, 这些import都失败的地方, 为什么在运行时没有报错? 首先这些@Configuration类没有被程序中的类引用到 其次即使引用到这个类,不一定引用到类中的具体某个方 ...

  9. ubuntu搭建mediawiki

    1.搭建lamp环境,lamp指的是: Linux+Apache+Mysql/MariaDB+Perl/PHP/Python (我们安装的是Linux+apache2+postgresql+php) ...

  10. Java面向对象_单例设计模式

    单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 1.构造方法私有化 2.声明一个本类对象 3.给外部提供一个静态方法获取对象实例 两种实现方式:饿汉式和懒汉式 何种情况下使用呢?当 ...