[TOC]
在打jar的时候经常会遇见怎么处理依赖的jar的问题,用maven的话会很方便的处理这样的问题
以下我介绍三种打jar依赖的方式
1. 用assembly plugin 可以把所有的依赖打成一个jar 一个可运行的jar
pom.xml配置如下
<build>
<plugins>
<!-- compiler插件, 设定JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.7</source>
<target>1.7</target>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.xxx.xxxx.xxx</mainClass><!--修改自己的类路径-->
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 用assembly的方式打包很重,因为每次修改可都要重新打重新传的。所以我们可以把工程依赖的jar都打到一个lib的路径中上传上去,在运行jar的时候再吧这个lib中的jar加载到classpath中 ,这样的方式有很多优点,相当于自己创建了一个容器 运行jar的时候绝对对系统环境最小依赖。还可以把配置文件一同打到jar的外面方便运维。
pom.xml 代码如下:
<build>
<plugins>
<!-- 把依赖的jar包拷到lib目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- 以utf-8编码拷贝配置文件,拷贝过程中是可以做变量替换的,也就是说你的配置文件可以是个模板,里面的${}所包含的内容是可以拷贝过程中替换的 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<outputDirectory>${project.build.directory}</outputDirectory>
<!--把配置文件拷到和jar包同一个路径下 -->
<resources>
<resource>
<directory>conf</directory>
<includes>
<include>hdfs-site.xml</include>
<include>log4j.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- 加载class -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 加载的class目录的前缀(依赖的jar目录) -->
<mainClass>com.xxx.xxx
</mainClass>
<!--入口类名 -->
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
这个pom完成了把工程依赖jar 都打到./lib目录中,对应的配置文件打到./conf中 告诉的java -jar的main入口等这样工程就打完了。
问题来了,怎么来加载这些依赖呢?so… a shell 奉上:
#!/bin/bash -
CLASSPATH="."
for jarfile in `ls lib/.`; do
CLASSPATH="${CLASSPATH}:lib/$jarfile"
done
export CLASSPATH
java -cp ${CLASSPATH}:your.jar com.*.*.Main $*
这样在运行your.jar的时候 它对应的依赖jar就可以加载上去了
- 其实上2种主要是让大家学习一下原理,第三种方式是最简单地方式
maven工程为例:
命令:
mvn dependency:copy-dependencies -DoutputDirectory=lib package
#这样就是把依赖的jar都打到了lib中了
java -Djava.ext.dirs=lib MyClass #加载lib中的jar 就行了
java -Djava.ext.dirs=../lib -cp yourjar-1.0-SNAPSHOT.jar mainclass