1.说明
本文的打包操作适用于
普通的java项目
。
本文介绍的 maven 的打包方式是把java项目的第三方依赖包与主程序独立出来,即目标jar包与依赖包目录同级。
本文介绍的项目中包含自己写的本地的第三方依赖包。
2.具体的操作
2.1 项目结构介绍
一个
标准的maven项目
: 目录结构完全符合maven规范
【注意】:自己的第三方依赖包的名称中一定要包含一个 版本号的信息,这样在pom.xml中配置时可以使用到。 如 :java-utile-from-northcastle-1.0.jar
中的-1.0
helloworld-maven-java
| -- src
| -- main
| -- java
| -- com.northcastle
| -- App.java : 主类
| -- resources
| -- libs
| -- java-utile-from-northcastle-1.0.jar
| -- test
| -- java
| -- com.northcastle
| -- AppTest.java
| -- resources
|-- pom.xml
App.java 的文件内容:
package com.northcastle;
import com.alibaba.fastjson.JSONObject;
import com.northcastle.utile.a.UtileA;
import com.northcastle.utile.b.UtileB;
/**
* Hello world!
*
*/
public class App {
public static void main( String[] args ){
System.out.println("=== App run begin ===");
System.out.println( "Hello World!" );
System.out.println( "欢迎使用maven进行打包工作" );
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","northcastle");
System.out.println("jsonObject is : "+jsonObject);
UtileA.sayHelloA(); // 使用到了自己的第三方的依赖包
UtileB.sayHelloB(); // 使用到了自己的第三方的依赖包
System.out.println("=== App run end ===");
}
}
2.2 pom.xml文件内容(核心)
pom.xml 中主要 包含了引入的第三方的依赖包(包含自己写的第三方依赖包)、以及跳过测试的配置、打包的配置。
具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- 当前项目的坐标信息-->
<groupId>com.northcastle</groupId>
<artifactId>helloworld-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<!--设置打包的类型为 jar 包-->
<packaging>jar</packaging>
<!-- 自定义的属性设置,可以自己进行配置和修改-->
<properties>
<!-- maven 编译代码使用的jdk版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- maven 执行代码使用的jdk版本 -->
<maven.compiler.target>1.8</maven.compiler.target>
<!-- maven 编译使用的编码 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<!-- maven 进行项目构建使用的编码,避免中文乱码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- maven 生成项目报告使用的编码 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- 依赖中默认带有一个 junit 单元测试-->
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 引入自己写的jar包
groupId : 可以随便写一个
artifactId : 建议使用自己的jar包的名称(不带版本号)
version : 使用jar包名称中的版本号
scope : 一定是 system
systemPath : 指定自己的依赖包
-->
<dependency>
<groupId>com.northcastle</groupId>
<artifactId>java-utile-from-northcastle</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/libs/java-utile-from-northcastle-1.0.jar</systemPath>
</dependency>
</dependencies>
<build>
<!-- 指定最后构建打包成功的压缩包的名字 -->
<finalName>helloworld-maven-java</finalName>
<plugins>
<!-- 1.maven 打包时跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <!-- 测试使用到的插件 -->
<configuration>
<skip>true</skip><!-- 声明跳过测试 -->
</configuration>
</plugin>
<!-- 2.1 maven 打包时指定main方法 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classesDirectory>target/classes</classesDirectory>
<archive>
<manifest>
<mainClass>com.northcastle.App</mainClass>
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
<!-- 手动把自己的依赖包添加到 MANIFEST.MF 清单文件中去!!! -->
<Class-Path>libs/java-utile-from-northcastle-1.0.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- 2.2 maven 打包时处理依赖的第三方jar包,解决 运行时 ClassNotFoundException 的异常 -->
<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>
<type>jar</type>
<includeTypes>jar</includeTypes>
<outputDirectory>
${project.build.directory}/libs
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.2.1 pom.xml 中表示指定程序入口类的配置
这一块是配置的核心:
最特殊的是 :配置中的这一句话 :
当有多个本地的jar包时,用空格
进行分开。
Class-Path标签只能有一个<manifestEntries> <!-- 手动把自己的依赖包添加到 MANIFEST.MF 清单文件中去!!! --> <Class-Path> . libs/java-utile-from-northcastle-1.0.jar xxxxx.jar</Class-Path> </manifestEntries>
<!-- 2.1 maven 打包时指定main方法 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classesDirectory>target/classes</classesDirectory>
<archive>
<!-- manifest 标签表示 jar包内的 MANIFEST.MF 清单配置文件的内容 -->
<manifest>
<!-- 1.mainClass 标签指定程序的入口类 -->
<mainClass>com.northcastle.App</mainClass>
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<!-- 2.classpathPerfix 标签 表示指定第三方依赖的目录名,和目标jar包同级 -->
<classpathPrefix>libs/</classpathPrefix>
</manifest>
<manifestEntries>
<!-- 手动把自己的依赖包添加到 MANIFEST.MF 清单文件中去!!! -->
<Class-Path>. libs/java-utile-from-northcastle-1.0.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
2.2.2 pom.xml 中表示第三方依赖的配置
这一块是配置的核心 : 如果不理解,直接抄上就行
<!-- 2.2 maven 打包时处理依赖的第三方jar包,解决 运行时 ClassNotFoundException 的异常 -->
<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>
<type>jar</type>
<includeTypes>jar</includeTypes>
<outputDirectory>
${project.build.directory}/libs
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
2.3 执行打包命令
在 pom.xml 文件所在的目录下执行打包命令 :
mvn clean package
2.4 查看打包后target目录
根据我们的pom.xml 中的配置,打包成功后:
1.会在target目录
下生成一个libs
的目录来存放我们的第三方的依赖包;
2.会在target目录
下生成我们的目标jar包
。
2.5 运行jar包,检查效果
使用
java -jar xxx.jar
命令,运行程序
》 ps : 如果各位coder出现打包成功,但在运行时报 ClassNotFoundException
的异常,请仔细阅读本篇文章的2.2节
,会给你启发的。
3.完成
Congratulations!
You are one step closer to success!