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批处理:
for %%i in (lib/*.jar) do call cpappend.bat %%i
java -cp %CLASSPATH% Test
set CLASSPATH=%CLASSPATH%;lib/%1后面不要有空格。
注:类路径中,最好把配置文件的路径放在jar文件的路径之前,因为我们实际项目中遇到过:有的jar包中包含同名配置文件把我们自己的配置文件给覆盖了的情况。改一下在classpath中的顺序,这样就可以让程序优先使用我们的配置文件。
方便修改配置的独立应用程序的执行方法已经出来了。下面的问题是,那些依赖的jar包,以及配置文件谁来拷出来?用maven来做这件事是最方便不过的了。
使用maven的resources插件。
<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>
<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>
<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>
3、最后一个plugin节点中的:
如果你有多个工程,统一用一个父pom来管理(这些工程的pom都继承自父pom),如果有的工程中使用了resources插件,你在使用maven打包时,会出现错误,maven命令无法成功执行。
提示的错误大意是:你在pom中指定要执行copy-resources任务,却没有resources插件。
解决的办法是在父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
<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 已经指定了运行参数
Class-Path:依赖的jar
相关推荐
maven打包 maven打jar包详细步骤
maven 打jar包,source包,并上传到本地maven库
当前pom.xml中详细的记录了将maven项目打成可运行jar包的完整代码,使用maven的插件maven-assembly-plugin,同时将所有依赖打到jar包中,亲测可用。
IDEA中使用maven打jar包,然后使用工具混淆代码,亲测有效
Maven打可运行jar包说明书
maven打jar包方法 并且java -jar *.jar可执行
主要介绍了Maven发布Jar包中文乱码解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
MAVEN下载JAR包时经常下载一半没有完成,如果项目中引用了这些JAR包项目就会无法启动,该工具就是可以扫描这些有问题的jar包并且删除,如果安装了JDK并配置环境变量直接双击运行即可
批量导入maven本地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包
JSONObject对象相关的jar包依赖,一共有6个;还有maven环境下管理的jar包
达梦数7据库j驱动包及方言包,maven依赖jar包,DM达梦数据库jdbc-jar包dialect方言jar包
刚学习Java的时候找jar包有点繁琐,后来才知道可以用maven直接导入,现在把maven中常用的jar包库上传,方便初学者。加油(ง •_•)ง
本篇文章主要介绍了Maven引入本地Jar包并打包进War包中的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中
maven中jar包为下载完成last清理,更好的让maven管理jar包
maven的jar包跟源码包 apache-maven-3.5.2-bin&apache;-maven-3.5.2-src
下载解压压缩包,把对应的jar包复制到对应的java安装目录下,重启eclipse,即可运行
主要介绍了Maven打jar包的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
比较常用的Jar包,maven比较常用的Jar包不用从中央仓库下载。节省时间