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

maven打成一个大jar包

 
阅读更多

 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脚本:

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批处理:

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

    下面是cpappend.bat:

Batch代码

    @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里的配置如下:

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文件不需要放在外面。

到这里,用maven打独立应用程序的jar包的方式就讲解完了。在这再补充一个小知识。
如果你有多个工程,统一用一个父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>
分享到:
评论

相关推荐

    maven打成可运行jar包

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

    maven打包 maven打jar包详细步骤

    本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`(也称为`compile`)和`install`。每个阶段包含一系列的阶段(或者称为目标,如`compile`...

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

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

    spring boot 入门,maven打成jar包,运行例子

    spring boot 入门例子, 打成jar包,直接运行.快速入门,学习spring bootspring boot 入门例子, 打成jar包,直接运行.快速入门,学习spring boot

    用Maven打成可执行jar,包含maven依赖,本地依赖的操作

    Maven 打包可执行 jar 并...使用 Maven 打包可执行 jar 文件,并包含 Maven 依赖和本地依赖,是一个非常有用的技术。在实际开发中,我们可以根据项目的需求选择合适的依赖项和打包方式,以便生成可执行的 jar 文件。

    maven打包成第三方jar包且把pom依赖包打入进来的方法

    当开发的项目需要打包成JAR文件并分发给其他项目使用时,通常需要将项目依赖的其他JAR包一同打包进去,这就涉及到如何将POM文件中定义的依赖一起打包成一个独立的第三方JAR包。本文将介绍如何利用Maven的相关插件和...

    Maven将带有第三方依赖的可执行程序打包示例

    maven-assembly-plugin 插件打第三方依赖包进 jar,spring 有 org.springframework.beans.factory.parsing.BeanDefinitionParsingException 异常怎么办? maven-shade-plugin 插件打第三方依赖包,spring 有 java....

    maven打jar包

    "maven打jar包"是指使用Maven来打包Java应用程序,将其编译后的类文件和相关资源打包成一个可执行的JAR(Java Archive)文件。这个过程是开发流程中的重要环节,因为它使得代码可以方便地分发、部署和运行。 【描述...

    myeclipse用maven构建dubbo服务的可执行jar包

    本文将详细讲解如何在MyEclipse环境中利用Maven来构建一个包含Dubbo服务的可执行JAR包。 首先,我们要了解Maven。Maven是一个项目管理和综合工具,它通过配置文件(pom.xml)来管理项目的依赖关系、构建过程和插件...

    将多个jar包合并为一个jar包

    为了简化项目结构、减少资源占用以及方便管理,开发者有时会选择将多个JAR包合并成一个单一的JAR包。这个过程被称为JAR文件的合并。本文将详细讲解如何进行这项操作,并分享一个实用的合并工具。 首先,理解JAR文件...

    maven 3 jar 运行文件打包

    在Java开发中,Maven是一个广泛应用的构建工具,它能够帮助我们管理项目依赖、构建工件(如JAR文件)以及自动化项目的构建过程。当我们想要将Java应用程序打包成可执行的JAR文件时,Maven提供了方便的插件来实现这一...

    【绝对可行,解决404】jfinal项目打包成jar在控制台运行方法

    本文将详细介绍一个非Maven项目的JFinal应用如何打包成JAR,并在控制台上运行。 首先,JFinal项目打包的关键在于确保所有依赖的库和配置文件都被包含在内。由于本项目不是通过Maven构建的,我们需要手动处理这些...

    MAVEN打可运行jar包

    【MAVEN打可运行jar包】是Java开发中常见的任务,用于将项目打包成一个可独立运行的JAR文件,方便部署和分发。在Java世界里,Maven是一个强大的项目管理和依赖管理工具,它通过配置文件(pom.xml)来管理项目的构建...

    IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

    使用Eclipse进行打jar包可以是一个不错的选择,Eclipse提供了fat jar插件,可以方便地将依赖的jar包打包到一个文件中。 知识点7:打好的jar包在使用时的问题 在使用打好的jar包时,可能会出现一些问题,例如...

    springboot工程jar包加密

    当一个项目被打包成jar文件后,这通常意味着它可以作为一个独立的应用程序运行。然而,随着项目的部署和分发,保护源代码和敏感信息的安全变得至关重要。"springboot工程jar包加密"这个话题就是关于如何确保Spring ...

    使用Maven assembly打多个自定义包及War包简介

    Assembly插件是Maven生态系统中的一个组件,它的主要功能是将项目的所有依赖、资源和配置文件打包成不同的格式,如tar.gz、zip或jar等。 首先,我们需要在`pom.xml`文件中引入Maven Assembly插件。这可以通过在`...

    ant打jar包时, 怎么把所依赖的jar包与从源码中编译过来class文件合并成最终的一个jar?

    在Java开发过程中,将源代码编译为class文件并打包成jar是常见的步骤。当我们有多个jar包相互依赖时,需要将它们合并成一个单一的jar,以便于部署和使用。Ant是一个流行的Java构建工具,它允许我们通过配置XML文件...

    ofdrw .ofd 转 .pdf 所需要的jar包,不是maven项目的看过来.rar

    在这个压缩包中,包含的jar包可能是`ofdrw-converter`的一个实现,这是一个用于将OFD转换为PDF的工具。由于描述中提到“如果不是maven项目”,这意味着这些jar包可能需要手动添加到项目的类路径中,而不是通过Maven...

    maven+springboot打成jar包的方法

    Maven+SpringBoot打成JAR包的方法 Maven是Apache软件基金会的一个开源项目,主要用于Java项目的自动化build、测试、打包、部署等过程。SpringBoot是一个基于Java的框架,用于快速构建生产级别的应用程序。本文将...

    Springboot项目正确打jar包maven版pom.rar

    有了正确的pom.xml配置,你可以在命令行中运行`mvn clean package`命令来清理项目、编译源代码并打包成JAR。如果你想要跳过测试,可以使用`mvn clean package -DskipTests`。 5. **运行打包后的JAR**: 打包完成...

Global site tag (gtag.js) - Google Analytics