文章目录
- 目标
- 利用Idea+Maven我们可以打出以下三种不同的jar包:
- 一、在本地创建一个Maven项目
- 二、编辑pom.xml文件和逻辑代码
- 可执行jar包
目标
我们本地的项目要通过打成Jar包进行发布或者供其他人使用。今天记录下利idea和maven完成项目的打包过程。
利用Idea+Maven我们可以打出以下三种不同的jar包:
- 不包含引入的依赖jar包
- 包含全部引入的依赖jar包
- 包含部分引入的依赖jar包
以一个简单的项目为例:
一、在本地创建一个Maven项目
创建项目时,我们可以选择创建maven项目。
二、编辑pom.xml文件和逻辑代码
- 如果我们要打不包含依赖的jar包
此时,我们的pom.xml文件不用作特殊处理,只需要引入项目所需的jar包即可。
<?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.chen</groupId>
<artifactId>PinYinHelper</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<!--引入项目依赖-->
<dependencies>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
</project>
此时,我们直接使用右侧maven中的Lifecycle中的package指令打包即可,在package指令上双击:
此时经过maven的编译打包,即可在我们项目路径的target目录下生成不包含依赖的项目jar包。
- 如果我们要打包含依赖的jar包
此时,我们的pom.xml文件中则要借助assembly插件完成
<?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.chen</groupId>
<artifactId>PinYinHelper</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!--借助assembly插件完成包含项目依赖的打包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<!--设置将所有的依赖打进jar包中-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 此处指定main方法入口的class -->
<mainClass>com.chen.Application</mainClass>
</manifest>
</archive>
<!--指定打出的jar包输出目录-->
<outputDirectory>E:\IdeaWorkspace\PinYinHelper1\target</outputDirectory>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!--将assembly插件绑定到package上,到时只需要双击package指令即可-->
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--引入项目依赖-->
<dependencies>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
</project>
此时,我们同样双击右侧maven中的Lifecycle中的package指令,经过插件的编译打包,在我们设定的jar包输出目录中生成包含项目所有依赖的jar包。
- 如果我们要打包含部分依赖的jar包
比如说,想做一个工具jar包,依赖公共jar和自己本地jar包,本地jar包需要解压成class打到jar包内,而依赖的公共jar包则不需要。
剔除公共jar包 可以用
的值的含义:
compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
例如:我们在项目依赖中增加junit的依赖,并在scope属性中设置为compile,然后将依赖打进项目包中:
可见,此时junit是被打进了jar包中的。若我们将scope属性设置为test,在打包试试:
可见,此时junit是没有被打进jar包中的。
可执行jar包
如果我们在使用assembly插件打包时指定了程序的主入口类,则此时打出的jar包为可执行jar包,可以通过cmd命令行去执行我们的Jar包。命令为:Java -jar xxxx.jar.