1. 声明

当前内容主要为测试和使用Maven打包,将当前的资源文件、maven的lib文件以及生成的jar文件分开来

当前内容为:

  1. 使用maven打包并分离jar项目中的lib、resources、jar
  2. 使用springboot打包
  3. 使用eclipse的export方式打包
  4. 比较各种的优缺点

2.maven打包配置(将lib、resources、jar分离)

基本的pom

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
							<mainClass>com.hy.apache.commons.test.cli.MySQLConnectionCliTest</mainClass>
						</manifest>
						<manifestEntries>
                           <!-- 将config也设置为classpath路径可访问的地方	 -->
                           <Class-Path>config/.</Class-Path>
                       </manifestEntries>
					</archive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>2.10</version>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<!-- 放在项目构建的target的里面	 -->
							 <outputDirectory>${project.build.directory}/lib</outputDirectory> 							
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>resources</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
					<include>**/*.tld</include>
				</includes>
				<filtering>true</filtering>
				<!-- 放在项目构建的target的里面	 -->
				<targetPath>${project.build.directory}/config/</targetPath>
			</resource>
		</resources>
	</build>

maven-dependency-plugin将依赖打成lib包,指定了输出文件的位置
org.apache.maven.plugins,主要是添加启动类,并添加config为classpah查找的位置
resources中主要为指定资源或者配置文件输出的位置为config

2.指定打包后:

java maven 打包 服务器部署 maven打包lib_spring

此时lib文件和config文件在同一目录下,并且可以执行

3. springboot方式打包

由于当前项目不是一个web项目,所以没有使用springboot的注解,但是使用的是springboot的打包,所以打包后会将当前的资源文件放入在classes中

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.18.RELEASE</version>
</parent>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<mainClass>com.hy.apache.commons.test.cli.MySQLConnectionCliTest</mainClass>				
			</configuration>	
		</plugin>
				
	</plugins>
	<resources>
		<!-- 加入这一行代码后,当前的打包工作就正常了 -->
		<resource>
			<directory>resources</directory>
			<includes>
				<include>**/*.properties</include>
				<include>**/*.xml</include>
				<include>**/*.tld</include>
			</includes>
			<filtering>true</filtering>
			<!-- <targetPath>${project.build.directory}/config/</targetPath> -->
		</resource>
	</resources>
</build>

结果为:

java maven 打包 服务器部署 maven打包lib_maven_02


虽然可以手动修改并将db.properties设置在外面但是无法得到该配置文件(有的时候需要将lib打到jar里面,且有的时候并不需要web程序,且有的时候需要配置文件在外面)

4.eclipse的默认export方式打包

java maven 打包 服务器部署 maven打包lib_spring_03


java maven 打包 服务器部署 maven打包lib_java maven 打包 服务器部署_04


发现该打包没有任何的lib库,不能执行

5. 比较

java maven 打包 服务器部署 maven打包lib_jar_05

java maven 打包 服务器部署 maven打包lib_maven_06


java maven 打包 服务器部署 maven打包lib_jar_07

依次看来,相同点都是主要的入口类,当前文件的版本

1.maven中的Class-Path指定了两个位置一个是config/一个是lib,这就是为什么可以找到config文件和lib文件的原因(如果修改这两个位置就可以实现配置文件的修改和库的修改了)

2.SpringBoot中的Spring-Boot-ClassesSpring-Boot-Lib分别指向两个不同的地址,且都是指向jar包中的内部的文件的地址(源码发现具有final修饰,所以改动小)

3.本人直觉判断maven的打包和eclipse的export方式的具有共同点

6. 修改eclipse打包的MANIFEST.MF文件(直接添加Class-Path并复制配置文件和lib文件)

使用winrar查看

java maven 打包 服务器部署 maven打包lib_jar_08


修改该文件(注意有两个换行)

Manifest-Version: 1.0
Class-Path: config/. lib/commons-cli-1.4.jar lib/mysql-connector-java-5.1.34.jar
Main-Class: com.hy.apache.commons.test.cli.MySQLConnectionCliTest

java maven 打包 服务器部署 maven打包lib_maven_09

拷贝对应的config文件和lib文件(或者手动创建也可以)

java maven 打包 服务器部署 maven打包lib_jar_10

执行结果:

java maven 打包 服务器部署 maven打包lib_java maven 打包 服务器部署_11


直接由不可执行变成执行成功(这个表示Class-Path可以指定多个位置,指定为config文件位置可以从类路径上加载配置文件,指定为lib可以从类路径上加载jar文件)