`
hy90171
  • 浏览: 59149 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

maven打jar包

 
阅读更多

Java独立应用程序的执行有两种方式: 
1、java -jar 命令 

2、java -classpath 命令 

 

一、使用java -classpath

其中,因为java -jar 不接收classpath参数(或者说-classpath对它不起作用),因此必须把所有依赖的文件都打到一个jar里(比如 One jar)。这样就存在一个问题:修改这个独立应用程序的配置文件会很不方便 
所以除非不用配置信息或从命令行指定配置信息,更好的方式应该是使用java -cp(即-classpath)的方式,并从类路径中读取配置文件。 


那么,一个独立应用程序的目录结构可以是如下形式: 
1、一个lib文件夹用于存放这个独立应用程序所依赖的jar包。 
2、把这个独立应用程序所依赖的配置文件(而且是可能需要修改的)放在与jar包同级目录下。 
3、一个jar包,里面是主程序。 
若要执行这个独立应用程序,可以使用脚本拼出classpath的值,然后调用java -cp 命令。 
    
在Linux下使用shell脚本:

CLASSPATH="."
#遍历应用程序依赖的jar包,并加入CLASSPATH。
for jarfile in `ls lib/.`; do
    CLASSPATH="${CLASSPATH}:lib/$jarfile"
done

export CLASSPATH
java -cp ${CLASSPATH} Test


在windows平台下就要麻烦一些了,使用dos批处理:

@echo off
for %%i in (lib/*.jar) do call cpappend.bat %%i
java -cp %CLASSPATH% Test

 

cpappend.bat是不是见过?没错,tomcat下的,直接从那抄的,dos的批处理的写法我是没研究明白。 
set CLASSPATH=%CLASSPATH%;lib/%1后面不要有空格。 
注:类路径中,最好把配置文件的路径放在jar文件的路径之前,因为我们实际项目中遇到过:有的jar包中包含同名配置文件把我们自己的配置文件给覆盖了的情况。改一下在classpath中的顺序,这样就可以让程序优先使用我们的配置文件。

方便修改配置的独立应用程序的执行方法已经出来了。下面的问题是,那些依赖的jar包,以及配置文件谁来拷出来?用maven来做这件事是最方便不过的了。 
使用maven的resources插件。 
pom代码:
<!-- 把依赖的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>src/main/resources/</directory>
						<includes>
							<include>config.xml</include>
							<include>log4j.xml</include>
						</includes>
						<filtering>true</filtering>
					</resource>
				</resources>
			</configuration>
		</execution>
	</executions>
</plugin>
 
<!-- 打jar包时需要把配置文件给排除在外 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>jar</goal>
			</goals>
			<configuration>
				<classifier>lib</classifier>
				<excludes>
					<exclude>config.xml</exclude>
					<exclude>log4j.xml</exclude>
				</excludes>
			</configuration>
		</execution>
	</executions>
</plugin>

上面有几个需要特别说明的地方: 

1、phase节点表示要在什么阶段执行这个任务,比如:

    <phase>package</phase>
    <goals>

        <goal>copy-dependencies</goal>
   </goals>

表示在打包(package)之前执行copy-dependencies的任务(关于copy-dependencies,请查阅resources插件的说明)。 
2、最后一个plugin节点中的classifier节点,表示这种方式(排除了配置文件)打出的jar包通过什么来和别的jar包区分开,我设的值是lib,这样打出来的包名就是:xxxx-lib.jar 
3、最后一个plugin节点中的: 
Pom代码:
<exclude>config.xml</exclude>
<exclude>log4j.xml</exclude>
可以写成:
Pom代码
<exclude>*.xml</exclude>
我没这么写,是因为我还有其它的.xml文件不需要放在外面。 

如果你有多个工程,统一用一个父pom来管理(这些工程的pom都继承自父pom),如果有的工程中使用了resources插件,你在使用maven打包时,会出现错误,maven命令无法成功执行。 
提示的错误大意是:你在pom中指定要执行copy-resources任务,却没有resources插件。 
解决的办法是在父pom中加入: 
Pom代码
<pluginManagement>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<version>2.3</version>
			<configuration>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</pluginManagement>
运行:java -cp
 
二、java -jar 命令 
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.3.2</version>
			<configuration>
				<source>1.6</source>
				<target>1.6</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<configuration>
				<archive>
					<manifest>
						<addClasspath>true</addClasspath><!-- 加载class -->
						<classpathPrefix>lib/</classpathPrefix><!-- 加载的class目录的前缀(依赖的jar目录) -->
						<mainClass>com.abc.ABCTest</mainClass><!-- 入口类名 -->
					</manifest>
				</archive>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<executions>
				<execution>
					<id>copy</id>
					<phase>install</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
					<configuration>
						<outputDirectory>${project.build.directory}/lib</outputDirectory><!-- 拷贝所以依赖存放位置 -->
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
可以查看打包后的jar的 MANIFEST.MF 已经指定了运行参数
Main-Class: com.taxi.timer.TaxiTimerLauncher
Class-Path:依赖的jar
后续只要运行:java -jar *.jar 即可运行Main-Class
 
  • bat.rar (963 Bytes)
  • 下载次数: 19
分享到:
评论
1 楼 pipilu 2014-04-22  
就不能多打几个字注明转载么?

相关推荐

    maven打成可运行jar包

    当前pom.xml中详细的记录了将maven项目打成可运行jar包的完整代码,使用maven的插件maven-assembly-plugin,同时将所有依赖打到jar包中,亲测可用。

    Maven发布Jar包中文乱码解决方法

    然而,在使用 Maven 发布 Jar 包时,ometimes 中文字符会出现乱码问题。本文将详细介绍 Maven 发布 Jar 包中文乱码解决方法。 一、问题分析 在使用 Maven 部署 Jar 包时,可能会出现中文乱码问题。这种问题的出现...

    idea+maven打jar包的两种方式

    "Idea+maven打jar包的两种方式" Idea+maven打jar包是开发者在使用Idea和Maven时经常遇到的一个问题,本文将详细介绍Idea+maven打jar包的两种方式。这些方式可以帮助开发者快速地将项目打包成jar包,并在Maven仓库中...

    JSONObject相关jar包和maven管理jar包

    标题"JSONObject相关jar包和maven管理jar包"暗示了我们讨论的主题集中在JSONObject类库的使用上,特别是如何在Java项目中通过jar包和Maven构建工具来管理和利用这个类库。JSONObject是Java编程语言中用于处理JSON...

    Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中

    ### Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中 #### 背景介绍 随着微服务架构的流行,Spring Boot 成为了开发微服务应用时首选的技术栈之一。它简化了传统的Java Web应用程序的开发...

    批量导入maven本地jar包

    批量导入maven本地jar包

    MAVEN下载JAR包修复

    MAVEN下载JAR包时经常下载一半没有完成,如果项目中引用了这些JAR包项目就会无法启动,该工具就是可以扫描这些有问题的jar包并且删除,如果安装了JDK并配置环境变量直接双击运行即可

    mavenjar包

    标题中的 "mavenjar 包" 指的是使用 Maven 构建的 JAR 文件,通常包含了一个完整的Java项目,包括所有依赖的库。这种 JAR 文件可以被直接运行,或者作为其他应用的依赖来使用。 描述中提到的步骤,是在本地环境中...

    maven2 jar包

    maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包

    Maven打jar包的三种方式(小结)

    Maven打jar包的三种方式 Maven是一款流行的Java项目管理和构建工具,打包成jar文件是Maven的一个重要功能。本文将介绍Maven打jar包的三种方式,每种方式都有其特点和应用场景。 方式一:不包含依赖的jar包 在...

    maven安装jar包工具

    Maven通过中央仓库下载所需的jar包,使得开发者能够轻松地集成第三方库。然而,有时候我们需要将本地的jar包安装到Maven仓库,以便于在项目中引用,这就是“maven-install-jar-tool”所解决的问题。 “maven-...

    maven中jar包为下载完成last清理

    maven中jar包为下载完成last清理,更好的让maven管理jar包

    maven本地仓库(常用Jar包)

    "maven常用Jar包"指的是在Java开发中频繁使用的第三方库,例如Spring框架、Hibernate ORM、Apache Commons系列库、JSON解析库如Jackson或Gson,以及测试框架JUnit等。这些库已经被广泛地接受并应用在各种项目中,...

    使用python编写的自动生成maven批量上传jar包工具

    maven上传jar包到nexus私有库 由于是nexus菜鸟,不知道要上传哪些包,所以全部本地上传,一个一个的写太麻烦,于是写了个批量生成maven脚本的py脚本,使用说明见py文件内部说明

    maven本地仓库错误jar包删除

    一键删除maven本地仓库中下载错误的jar包资源(以lastUpdated结尾的文档)

    maven批量导入jar包到本地仓库

    针对这个问题,我们可以利用一个名为“maven批量导入jar包到本地仓库”的工具,它简化了这个过程,使得批量导入成为可能。 这个工具的核心功能是自动化处理JAR包的导入,省去了手动操作的步骤。它的工作原理是通过...

    maven中jar包的下载

    maven的jar包的下载https://blog.csdn.net/swtesting/article/details/82732845 maven中jar包的下载 https://mvnrepository.com/ 阿里云jar包的查找

    Maven 下载jar包可能存在的问题以及解决方法

    Maven 下载jar包可能存在的问题以及解决方法

    java代码-使用java手动写一个maven下载jar包的源代码

    java代码-使用java手动写一个maven下载jar包的源代码 ——学习参考资料:仅用于个人学习使用!

Global site tag (gtag.js) - Google Analytics