`
pipilu
  • 浏览: 40004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用maven打出独立应用程序的jar包

    博客分类:
  • Java
阅读更多
    Java独立应用程序的执行有两种方式:
   java -jar 命令
和 java -classpath 命令

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

    #---------------下面是以前写错的部分,不需要这种方式把配置文件加入到类中径中。
    # 因为类路径中设都应该是目录(而不是文件),jar文件也是按目录来处理的
    #
    # 配置文件的遍历(与上类似)
    # 这里面我的配置文件都是xml的
    #for configfile in `ls *.xml`; do
    #    CLASSPATH="configfile:${CLASSPATH}"

    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:
   
    @echo off
    if ""%1"" == """" goto end
    set CLASSPATH=%CLASSPATH%;lib/%1
    shift

    rem Process the remaining arguments
    :setArgs
    if ""%1"" == """" goto doneSetArgs
    set CLASSPATH=%CLASSPATH% %1
    shift
    goto setArgs
    :doneSetArgs
    :end
    

    cpappend.bat是不是见过?没错,tomcat下的,直接从那抄的,dos的批处理的写法我是没研究明白。

    set CLASSPATH=%CLASSPATH%;lib/%1后面不要有空格。

注:类路径中,最好把配置文件的路径放在jar文件的路径之前,因为我们实际项目中遇到过:有的jar包中包含同名配置文件把我们自己的配置文件给覆盖了的情况。改一下在classpath中的顺序,这样就可以让程序优先使用我们的配置文件。

    这样,方便修改配置的独立应用程序的执行方法已经出来了。下面的问题是,那些依赖的jar包,以及配置文件谁来拷出来?用maven来做这件事是最方便不过的了。
    使用maven的resources插件。
    下面我们要做的就是:在使用maven打包时,把程序依赖的jar包都拷出来,配置文件拷出来。同时,因为要使用外部的配置文件,所以要避免把配置文件打到jar包里。pom里的配置如下:
   
   <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>test.Test</mainClass><!-- 入口类名 -->
						</manifest>
					</archive>
				</configuration>
			</plugin>
   <!-- 把依赖的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节点中的:
<exclude>config.xml</exclude>								<exclude>log4j.xml</exclude>

可以写成:
<exclude>*.xml</exclude>

我没这么写,是因为我还有其它的.xml文件不需要放在外面。

到这里,用maven打独立应用程序的jar包的方式就讲解完了。在这再补充一个小知识。
如果你有多个工程,统一用一个父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>
分享到:
评论
2 楼 pipilu 2014-04-24  
不知道为什么丢了部分内容,之后再抽空补充完善
1 楼 daur 2011-08-24  
谢谢~~受用了~~

相关推荐

    打Jar包小工具,运行cmd.bat自动打jar包

    在Java开发过程中,打包应用程序为JAR(Java Archive)文件是一项常见的任务,它将源代码编译后的类文件和其他资源组合成一个独立的可执行文件。"打Jar包小工具"是一个便捷的解决方案,旨在简化这个过程。这个工具...

    MyEclipse或Eclipse打jar包插件+详细的使用教程

    3. **Apache Maven**:如果你的项目是Maven管理的,可以使用Maven的`assembly`或`shade`插件来生成包含所有依赖的单个JAR。 四、注意事项 - 在打包时,确保所有外部库都已正确导入,否则打包后的JAR可能无法运行。...

    项目进行打jar包(Fat)

    在IT行业中,构建可执行的Java应用程序通常涉及将多个库和依赖项整合到一个单一的JAR文件中,这个过程被称为“打Fat JAR”或“Uber JAR”。这种打包方式使得用户可以在不配置额外环境的情况下运行程序,因为它包含了...

    Eclipse 打jar包(fat jar)操作步骤(内含截图)

    在Java开发中,将项目打包成可执行的JAR(Java Archive)文件是常见的需求,尤其是当需要分发或部署应用程序时。Eclipse作为一个流行的Java集成开发环境,提供了多种方式来实现这一目标,其中一种是创建"fat jar",...

    fatjar使用教程

    ### fatjar使用教程 在Java开发领域中,fatjar(也称为all-in-one jar或uber-jar)是一种将应用程序及其所有依赖项打包成一个单一的jar文件的技术。这种方式极大地方便了应用程序的部署与分发,尤其是在分布式系统...

    java+Swing打包成exe可安装文件(可在无jdk环境机器上运行)

    Java Swing 是一个用于构建桌面应用程序的 Java 库,它提供了丰富的用户界面组件,使得开发者能够创建出具有图形化界面的应用程序。然而,Java 程序通常需要 JRE(Java Runtime Environment)才能运行,这在某些没有...

    jodconverter-2.2.2.jar架包

    使用jodconverter-2.2.2.jar,开发者可以轻松地集成到Java应用程序中,实现文档转换功能。首先,需要在系统中安装OpenOffice或LibreOffice,并确保其服务运行正常。然后,通过以下步骤开始转换: 1. 添加依赖:将...

    JAVA&MAVEN&EASYEXCEL

    总的来说,Java作为基础,Maven作为项目管理和构建工具,EasyExcel作为Excel处理库,这三者结合,为Java开发者提供了强大的工具链,能够方便快捷地开发出处理Excel数据的应用程序。通过熟练掌握这些技术,开发者不仅...

    Springboot项目与vue项目整合打包的实现方式

    因此,在这种情况下,我们需要尽量减少部署时的服务软件需求,打出的包数量也尽量少。针对这种情况,我们可以采取在开发中做到前后端独立开发,打包时在后端Springboot打包发布时将前端的构建输出一起打入,最后只需...

    Scala基础(12)Spark命令参数及独立应用程序

    编写Spark独立应用程序通常涉及使用构建工具,如Scala的`sbt`或Java的Maven。对于Scala程序,你需要使用`sbt`来编译和打包。以下是一个典型的项目结构: ``` /usr/local/spark/mycode/ |-- src | `-- main | `-- ...

    args4j-tools-2.0.6.jar.zip

    args4j-tools-2.0.6.jar.zip文件包含了args4j工具库的2.0.6版本,它是一个方便、易用的Java库,用于解析命令行参数,简化了Java应用程序的命令行接口开发。本文将深入探讨args4j的核心特性、使用方法以及它在实际...

    aspose-cells-8.5.2-实现excel转pdf.zip

    总的来说,Aspose.Cells 8.5.2提供了一种高效且灵活的方式来实现Excel到PDF的转换,使得开发者能够轻松集成到自己的应用程序中,满足各种需求,无论是简单的文件转换还是复杂的格式处理。这个功能对于那些希望在不...

    Spring-boot

    - **内嵌服务器**:可以使用Tomcat、Jetty或Undertow作为内嵌容器,不需要打成WAR包部署。 - **简化Maven配置**:Spring Boot提供了一套默认的配置来帮助简化Maven配置。 - **独立的Spring应用**:无代码生成和无XML...

    aspectwerkz-2.1.jar.zip

    《AspectWerkz 2.1.jar:AOP在Java世界的应用与理解》 AspectWerkz是一款基于Java的面向切面编程(AOP)框架,它允许开发者在不修改现有代码的情况下,添加新的功能或者修改行为,实现了业务逻辑与横切关注点的解耦。...

    JrebelBrainsLicenseServerforJava-master.zip

    打包后的JAR文件可以作为一个独立的应用程序运行,或者作为其他Java项目依赖的一部分。 4. **部署服务器**:完成上述步骤后,将打包好的JAR文件部署到服务器上。这可能涉及到设置服务器环境、配置服务器端口、权限...

    Spring Boot 初学者入门代码(支持热部署、部署到服务器).zip

    1. **构建可执行JAR**: 使用Maven或Gradle构建工具,将项目打包成可执行的JAR文件。在Maven中,运行`mvn clean package`命令。 2. **上传与运行**: 将生成的JAR文件上传至服务器,使用`java -jar your-app.jar`命令...

    jfreechart例子和教程大全

    它支持多种图表类型,可以轻松地嵌入到Java Swing应用程序、Java Applet、Web应用服务器或者独立的Java应用中。其设计目标是易于使用、灵活定制,并且能够处理大数据量。 二、安装与导入 在项目中使用JFreeChart,...

    服务器项目部署详细示例文档

    - **打jar包**:适用于Spring Boot等独立应用。 - **打war包**:适用于传统的Servlet容器部署方式,需要额外部署到Tomcat等应用服务器上。 3. **项目部署**: - **前端项目部署**:将前端打包后的静态文件上传至...

    quartz的helloworld

    Quartz是一个开源的作业调度框架,它允许开发者在Java应用程序中安排任务的执行。这个"quartz的helloworld"示例旨在教你如何在Tomcat服务器上配置和使用Quartz来定期执行一个简单的任务——每五秒钟打印出"Hello, ...

    Spring Boot2如何构建可部署的war包

    默认情况下,Spring Boot 使用了内嵌的 Tomcat 服务器,项目最终被打成 jar 包运行,每个 jar 包可以被看作一个独立的 Web 服务器。但是,在传统的 Web 开发中,一般会将 Web 应用打成一个 war 包,然后将其部署到 ...

Global site tag (gtag.js) - Google Analytics