一个java工程中,一定会用的很多第三方的jar包。如何快速发布自己的工程和项目是一个需要掌握的技巧。maven是现在比较流行的项目管理工具。通过它的maven-jar-plugin和maven-assembly-plugin可以实现一个工程的快速自动发布。
我要进行发布的目标工程是一个osgi的插件工程,具有如下的特点:
1、通过org.tkxing.main.OptimizatorMain启动apache felix osgi框架和调用在felix osgi中发布的服务。
2、osgi的系统和业务bundle放在bundles目录中。
3、felix框架的配置文件放在conf目录中。
4、利用log4j作为系统的日志管理系统,配置文件log4j.xml放在项目根目录下。
希望通过maven完成的系统目录如下:
在完成的过程中,利用maven-jar-plugin和maven-assembly-plugin分成两步完成工程的发布。
1、生成org.tkxing.stock.test-1.0.jar
利用maven-jar-plugin生成这个可执行的jar包,需要完成两项的设置,一是jar包的main class,二是jar包利用其他jar的classpath,在pom文件中设置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.tkxing.main.OptimizatorMain</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> </execution> </executions> </plugin>
其中的manifest标签中的内容,将会添加在生成的jar包的manifest.mf文件中。
2、装配整个工程
利用maven的maven-assembly-plugin来完成整个项目的装配工作,在pom文件中,设置装配的具体要求,利用assembly.xml文件定义:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>jar-with-dependencies</id> <formats> <format>dir</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>/</outputDirectory> <includes> <include>org.tkxing.stock:org.tkxing.stock.test</include> </includes> </dependencySet> <dependencySet> <useProjectArtifact>false</useProjectArtifact> <outputDirectory>lib/</outputDirectory> <excludes> <exclude>org.springframework:spring-beans</exclude> <exclude>org.springframework:spring-asm</exclude> <exclude>org.springframework:spring-core</exclude> <exclude>org.springframework:spring-aop</exclude> <exclude>org.springframework:spring-context</exclude> <exclude>org.springframework:spring-expression</exclude> <exclude>org.springframework:spring-jms</exclude> <exclude>org.springframework:spring-tx</exclude> </excludes> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>conf</directory> <outputDirectory>conf</outputDirectory> </fileSet> <fileSet> <directory>bundles</directory> <outputDirectory>bundles</outputDirectory> </fileSet> </fileSets> <files> <file> <source>log4j.xml</source> <outputDirectory>/</outputDirectory> </file> </files> </assembly>
其中,formats部分,定义装配的结果是一个目录。
dependencySets部分中定义了两个dependencySet,第一个dependencySet的目的是把可运行的jar放在根目录下,利用的include选项;第二个dependencySet的目的是把所有依赖的jar包放在lib目录下,并利用excludes排除重复的jar包。
fileSets部分定义了把bundles和conf目录进行打包
files部分定义了打包log4j.xml文件。
通过以上两步,就完成了一个工程的打包。
完整的pom.xml文件如下所示:
<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> <parent> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock</artifactId> <version>1.0</version> </parent> <artifactId>org.tkxing.stock.test</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.googlecode</groupId> <artifactId>transloader</artifactId> <version>0.4</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.dao.impl</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.ruleengine.impl</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.sourcedata.getter</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.sourcedata.getter.impl</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.sourcedata.disassemble</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.sourcedata.disassemble.impl</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.jboss.javassist</groupId> <artifactId>com.springsource.javassist</artifactId> <version>3.9.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>com.springsource.org.hibernate</artifactId> <version>3.3.2.GA</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>com.springsource.antlr</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>com.springsource.org.apache.commons.collections </artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.dom4j</groupId> <artifactId>com.springsource.org.dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>javax.xml.stream</groupId> <artifactId>com.springsource.javax.xml.stream</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.objectweb.asm</groupId> <artifactId>com.springsource.org.objectweb.asm</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>com.springsource.slf4j.nop</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>com.springsource.javax.transaction</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>com.springsource.org.apache.commons.dbcp</artifactId> <version>1.2.2.osgi</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>org.springframework.aspects</artifactId> <version>3.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>org.springframework.context.support</artifactId> <version>3.0.4.RELEASE</version> </dependency> <!-- <dependency> <groupId>org.aspectj</groupId> <artifactId>com.springsource.org.aspectj.weaver</artifactId> <version>1.6.8.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>com.springsource.org.aspectj.runtime</artifactId> <version>1.6.8.RELEASE</version> </dependency> --> <dependency> <groupId>com.sun.xml</groupId> <artifactId>com.springsource.com.sun.tools.xjc</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>com.springsource.javax.activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>com.springsource.org.antlr.runtime</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>com.springsource.com.thoughtworks.xstream</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> <version>2.0.19</version> </dependency> <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>com.springsource.jxl</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.sourcedata.intergration</artifactId> <version>1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.predict</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.tkxing.stock</groupId> <artifactId>org.tkxing.stock.predict.impl</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.tkxing.activemq</groupId> <artifactId>activemqengine</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.5.0</version> <exclusions> <exclusion> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.objectweb.howl</groupId> <artifactId>com.springsource.org.objectweb.howl</artifactId> <version>1.0.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerVersion>1.5</compilerVersion> <fork>true</fork> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.tkxing.main.OptimizatorMain</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <phase>install</phase> <goals> <goal>single</goal> </goals> <configuration> <outputDirectory>d:/temp/stock</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>