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
相关推荐
当前pom.xml中详细的记录了将maven项目打成可运行jar包的完整代码,使用maven的插件maven-assembly-plugin,同时将所有依赖打到jar包中,亲测可用。
然而,在使用 Maven 发布 Jar 包时,ometimes 中文字符会出现乱码问题。本文将详细介绍 Maven 发布 Jar 包中文乱码解决方法。 一、问题分析 在使用 Maven 部署 Jar 包时,可能会出现中文乱码问题。这种问题的出现...
"Idea+maven打jar包的两种方式" Idea+maven打jar包是开发者在使用Idea和Maven时经常遇到的一个问题,本文将详细介绍Idea+maven打jar包的两种方式。这些方式可以帮助开发者快速地将项目打包成jar包,并在Maven仓库中...
标题"JSONObject相关jar包和maven管理jar包"暗示了我们讨论的主题集中在JSONObject类库的使用上,特别是如何在Java项目中通过jar包和Maven构建工具来管理和利用这个类库。JSONObject是Java编程语言中用于处理JSON...
### Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中 #### 背景介绍 随着微服务架构的流行,Spring Boot 成为了开发微服务应用时首选的技术栈之一。它简化了传统的Java Web应用程序的开发...
批量导入maven本地jar包
MAVEN下载JAR包时经常下载一半没有完成,如果项目中引用了这些JAR包项目就会无法启动,该工具就是可以扫描这些有问题的jar包并且删除,如果安装了JDK并配置环境变量直接双击运行即可
标题中的 "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包
Maven打jar包的三种方式 Maven是一款流行的Java项目管理和构建工具,打包成jar文件是Maven的一个重要功能。本文将介绍Maven打jar包的三种方式,每种方式都有其特点和应用场景。 方式一:不包含依赖的jar包 在...
Maven通过中央仓库下载所需的jar包,使得开发者能够轻松地集成第三方库。然而,有时候我们需要将本地的jar包安装到Maven仓库,以便于在项目中引用,这就是“maven-install-jar-tool”所解决的问题。 “maven-...
maven中jar包为下载完成last清理,更好的让maven管理jar包
"maven常用Jar包"指的是在Java开发中频繁使用的第三方库,例如Spring框架、Hibernate ORM、Apache Commons系列库、JSON解析库如Jackson或Gson,以及测试框架JUnit等。这些库已经被广泛地接受并应用在各种项目中,...
maven上传jar包到nexus私有库 由于是nexus菜鸟,不知道要上传哪些包,所以全部本地上传,一个一个的写太麻烦,于是写了个批量生成maven脚本的py脚本,使用说明见py文件内部说明
一键删除maven本地仓库中下载错误的jar包资源(以lastUpdated结尾的文档)
针对这个问题,我们可以利用一个名为“maven批量导入jar包到本地仓库”的工具,它简化了这个过程,使得批量导入成为可能。 这个工具的核心功能是自动化处理JAR包的导入,省去了手动操作的步骤。它的工作原理是通过...
maven的jar包的下载https://blog.csdn.net/swtesting/article/details/82732845 maven中jar包的下载 https://mvnrepository.com/ 阿里云jar包的查找
Maven 下载jar包可能存在的问题以及解决方法
java代码-使用java手动写一个maven下载jar包的源代码 ——学习参考资料:仅用于个人学习使用!