maven构建openfire插件

记录一次使用maven插件构建openfire插件的所有过程html

由于项目须要, 故把openfire源码下载下来修改发布, 期间要使用本身编写的openfire插件, 最新版的openfire使用maven构建, 故插件的项目构建方式也使用了maven, openfire的插件目录结构很是特殊,
点我了解更多, 须要个性化
的maven配置才能生成可用的插件jar
java

项目结构

project/
  |- pom.xml
  |- plugin.xml      
  |- readme.html     
  |- changelog.html  
  |- logo_small.gif  
  |- logo_large.gif  
  |- src
    |- main
      |- java(source dir)
      |- web

构建过程

首先把src-main下的java设置成source root文件夹, 使下面的类能够引用jdk环境, 编写好代码以后, 直接编写pom文件, 用maven插件去定义生成好的jar包内部结构web

爬坑1: 与src平级的几个文件不能打进jar包, 由于顶级文件夹并非resources文件夹

解决1: 使用maven-resources插件, 指定resource位置, 与在jar里的位置, 
也能够直接在build标签下使用resources标签声明, 这是maven的约定写法, 不过我仍是声明了插件

爬坑2: 仔细看openfire插件结构, 能够看到, 插件jar里面有个lib文件夹, lib下存放的jar才是真正java代码打包好的文件, 
我一开始想着使用resources插件, 把打包好的jar重复放进jar里(至关于向本身里放了个本身), 后来证实是矛盾的, 并且是很差使的

解决2: 使用ant插件, 定义最终的jar结构, 而且配置maven-jar, 只编译java类, 其他组织的工做交给ant插件作

pom文件(附说明)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 父工程为openfire插件工程 -->
    <parent>
        <artifactId>plugins</artifactId>
        <groupId>org.igniterealtime.openfire</groupId>
        <version>4.4.2</version>
    </parent>
    <groupId>com.gomyck</groupId>
    <artifactId>openfire-plugin-gomyck-sendmessage</artifactId>
    <name>Openfire Plugin Gomyck Sendmessage</name>
    <description>
        消息插件
    </description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <!-- 初次打包的jar名称 -->
        <finalName>gomyck-sendMessage</finalName>
        <plugins>
            <!-- maven编译插件, 声明周期为compiler, 主要负责编译java类 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <!-- 源代码开发版本 -->
                    <source>1.8</source>
                    <!-- 目标编译版本 -->
                    <target>1.8</target>
                    <!-- 编码方式 -->
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <!-- maven 打jar包插件, 这个插件遇到的坑最多, 其遵循就近原则, 若是在configuration中写了配置, 
            那么其默认的配置都会很差使, 好比include, 若是用了, 那么只会编译include的类 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <!-- 只在jar里放class文件, 若是不写这个, 那么resources插件生成的资源文件也会打进jar里, 若是写了这个,
                     resources插件只会在target-class文件夹下生成文件 -->
                    <includes>
                        <include>**/com/gomyck/**</include>
                    </includes>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
            
            <!-- maven 资源插件, 这个插件主要把一些外部文件变成打包时的资源文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <!-- resources 和 copy-resources, 若是是resources, 
                        则直接会在jar包里体现, 若是是copy-resources, 那还必须指定要copy的目标文件夹位置 -->
                        <goals>
                            <goal>resources</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <resources>
                        <resource>
                            <!-- 资源文件所在文件夹 -->
                            <directory>${project.basedir}</directory>
                            <!-- 是否使用文件过滤器 -->
                            <filtering>true</filtering>
                            <!-- 若是使用过滤器, 那么包含哪些文件 -->
                            <includes>
                                <include>changelog.html</include>
                                <include>logo_large.gif</include>
                                <include>logo_small.gif</include>
                                <include>plugin.xml</include>
                                <include>readme.html</include>
                            </includes>
                        </resource>

                        <resource>
                            <directory>${project.basedir}/src/main/web</directory>
                            <!-- jar包目标位置, 下面的意思是会在jar的根目录下创建web文件夹, 
                            而且把src/main/web下的全部文件都copy进去 -->
                            <targetPath>web</targetPath>
                        </resource>

                    </resources>
                </configuration>
            </plugin>

            <plugin>
                <!-- ant插件, 这个最重要了, 以上三个插件只是可以零散的把文件编译并放在target文件夹下, 
                我使用ant插件, 把文件整理起来, 并压缩到指定的jar里面 -->
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <!-- 调用阶段 -->
                        <phase>install</phase>
                        <goals>
                            <!-- 目标(命令) -->
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo message="开始构建插件包..."></echo>
                                <copy todir="${project.build.directory}/${project.build.finalName}-final/lib" overwrite="true" file="${project.build.directory}/${project.build.finalName}.jar"></copy>
                                <copydir dest="${project.build.directory}/${project.build.finalName}-final/" src="${project.build.directory}/classes/" excludes="org/**"></copydir>
                                <jar basedir="${project.build.directory}/${project.build.finalName}-final/" destfile="${project.build.directory}/${project.build.finalName}-final.jar"></jar>
                                <delete dir="${project.build.directory}/${project.build.finalName}-final/"></delete>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
</project>

ant文档地址(全部的ant构建命令可在此查看)

点击前往apache

我的博客 点击前往