测试发布(maven-assembly-plugin看好你哦)

项目改成了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;

clip_image002

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

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

clip_image003

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

clip_image004

现在要的是只打包部分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-INFclasses argetclassescomxxxsrpmcontrollers

需要的是:

WEB-INFclassescomxxxsrpmcontrollers

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

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

<fileSet>

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

<directory>target/classes/</directory>

<includes>

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

</includes>

</fileSet>

完美!就是这样配置了;

clip_image005

完整的配置如下:

<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挺好用,好强大!

clip_image006

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

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

总结:

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

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

原文地址:https://www.cnblogs.com/yejq/p/4455358.html