maven下产生一个包含依赖jar的可执行jar文件(create an executable JAR with dependencies using Maven)

 MAVEN  maven下产生一个包含依赖jar的可执行jar文件(create an executable JAR with dependencies using Maven)已关闭评论
4月 082021
 

想使用 java -jar xxx.jar 命令行直接执行一个可执行的jar包,而这个xxx.jar包是包含第三方的依赖包的,网上有许多文章描述如何修改pom.xml,但实际是没什么效果的,实验下来如下方法可以达到想要的效果:

 

  •  1.  pom.xml 的build下添加下列 plugin。
<build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.ouu.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>

    </plugins>
</build>
  • 2. 进入项目根目录, 在命令行下运行:

mvn clean compile assembly:single

这是在项目target目录下会产生一个xxxx-jar-with-dependencies.jar的可执行文件

maven依赖关系中Scope的取值

 MAVEN  maven依赖关系中Scope的取值已关闭评论
12月 162016
 

maven依赖关系中Scope的作用

可选择值

在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值: 
    * compile,缺省值,适用于所有阶段,会随着项目一起发布。 
    * provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 
    * runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 
    * test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 
    * system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

注意

此属性没有配置的话,则默认的是compile范围的,而对于scope为test类型的话,则不会进行传递依赖

关于maven可选依赖和排除依赖的学习

 MAVEN  关于maven可选依赖和排除依赖的学习已关闭评论
12月 312013
 

了解可选依赖和排除依赖的功能,能够帮助我们更好的理解依赖是什么、怎样使用、如何工作和何时最适宜应用。其中,排除依赖是作为依赖的基本概念而不是处于pom层。

一、    可选依赖

       当一个项目不适合分割成多个子模块的时候,我们可以使用可选依赖。它的思想在于某些依赖只应用于某些功能,而且当没有该功能时也不存在该依赖。理想状况下,一个功能可能被划分为一个子模块,该子模块是一个只有核心功能的项目,由于当你要使用这个子工程的功能的时候,你会需要它的全部,所以这个子工程只含有非可选性依赖。

      然而,如果工程不可被分割,这些依赖被声明为可选。如果一个用户想要使用和可选性依赖相关的功能,他们必须要在工程中重新声明可选性依赖。也许可选依赖和排除依赖不是解决问题的最好方法,但是不失为一种有效的解决方案。

      1. 为何使用可选依赖

      声明可选依赖不仅对于节省空间/内存等是重要的,而且对于使用一个工程的时候控制实际依赖的列表也是非常重要的。因为jar包最终可能编译成WAR、EAR、EJB等等,包含错误的jar包可能产生违反许可证协议、导致类路径错误等问题。

      2.如何使用optional标记

      在你的依赖声明中简单地将<optional>标记设置成true,就能将一个依赖声明为可选的。示例如下

<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional> <!-- value will be true or false only -->
    </dependency>
  </dependencies>
</project>

      3.可选依赖是如何工作的?

Project-A -> Project-B

      如上图所以projectA依赖projectB,当A在它的pom中声明B作为它的可选依赖时,这个关系会一直保持。 这就像在通常的构建中,projectB会被加到它的类路径中。

Project-X -> Project-A

      但是当另外一个工程projectX在它的pom中声明A作为其依赖时,可选性依赖这时就发挥作用了。你会发现projectB并不存在projectX的类路径中。如果X的类路径要包含B那么需要在你的pom中直接进行声明。

      4.例子:

      让我们假设现在有这样一个和Hibernate有类似功能的工程X2,支持多种诸如mysql, postgre, oracle等数据库驱动/依赖,所有这些驱动/依赖是X2但不是你的工程所需要的,所以一种比较可行的方法就是X2将这些驱动/依赖声明为可选的。这样,无论任何时候当你的工程在pom中声明X2作为直接依赖,X2所支持的这些驱动/依赖都不会被自动加到你工程的类路径中,相反地,你必须要直接声明需要使用的数据库驱动/依赖。

二、  排除依赖

       由于maven2.x会传递解析依赖,所以很有可能一些你不需要的依赖也会包含在工程类路径中。例如,一些你依赖的工程可能没有正确的声明它们的依赖集。为了解决这种特殊情况,maven2.x已经引入了显式排除依赖的概念。排除是设置在pom中指定的依赖上,并且有指定的groupId和artifactId来标注。当你构建工程时,该物件不会像解析加载依赖一样被加载到你工程的类路径中。

       1. 如何使用排除依赖

       我们在pom中的<dependency>段下面加上<exclusions>标签。

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

       2.排除依赖是如何工作的并且在何时使用它(作为最后一种解决方法)

Project-A
   -> Project-B
        -> Project-D <! -- This dependency should be excluded -->
              -> Project-E
              -> Project-F
   -> Project C

       如上图所示,Project-A依赖Project-B和C,Project-B依赖Project-D,Project-D依赖Project-E和F,默认的Project-A的类路径会包含:

B, C, D, E, F

       如果由于我们知道Project-D的某些依赖在仓库中丢失,那么我们不想Project-D和它所有的依赖加载到Project-A的类路径中,而且也不想/不需要依赖Project-D的Project-B的功能。在这种情况下,Project-B的开发者会提供一个Project-D的 <optional>true</optional>依赖,如下:

<dependency>
  <groupId>sample.ProjectD</groupId>
  <artifactId>ProjectD</artifactId>
  <version>1.0-SNAPSHOT</version>
  <optional>true</optional>

</dependency>

      然而,并不能达到你想要的效果。作为最后一种解决方法你仍然可以选择将它在Project-A中排除掉。如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample.ProjectA</groupId>
  <artifactId>Project-A</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>sample.ProjectD</groupId> <!-- Exclude Project-D from Project-B -->
          <artifactId>Project-D</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

      如果我们将Project-A部署到一个仓库中,而且Project-X声明了一个普通依赖到Project-A。那么Project-D是不是依旧从类路径中排除了?

Project-X -> Project-A

       答案是yes。Project-A已经声明了它不需要Project-D,所以它不会作为Project-A的传递依赖而引入。那么考虑下图的Project-X依赖Project-Y,

Project-X -> Project-Y
               -> Project-B
                    -> Project-D
                       ...

       Project-Y依赖于Project-B,并且它有需要Project-D所支持的功能,所以不能在Project-D的依赖列表中声明排除。也可再提供一个额外的我们可以解析Project-E的仓库。在这种情况下,不能将Project-D全局排除,因为它是Project-Y的合法依赖。

      在另外一种场景中,如果我们不需要的依赖是Project-E而不是Project-D,我们如何排除它呢?如下图:

Project-A
   -> Project-B
        -> Project-D
              -> Project-E <!-- Exclude this dependency -->
              -> Project-F
   -> Project C

      排除会影响到在依赖图上所有它的声明点以后的部分。如果你想排除Project-E而不是Project-D,可以简单的将排除指向Project-E。但是你无法将排除作用到Project-D,因为你无法改变Project-D的pom,如果你想这样,你应该用选择依赖而不是排除,或者将Project-D分成多个子工程,每个只有普通依赖。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample.ProjectA</groupId>
  <artifactId>Project-A</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>sample.ProjectE</groupId> <!-- Exclude Project-E from Project-B -->
          <artifactId>Project-E</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencie>

      3.为什么排除是依赖的基本概念,而不是在pom层上?

       这主要是为了确保依赖图是可预测的,并且防止排除不该排除的依赖。如果你用到了这个最终的解决方法并且必须要把它放到排除中,你必须绝对清楚你讨厌的传递依赖中有哪些依赖会被引入。

转自:http://www.taobaotest.com/blogs/show/1283

9月 042013
 

spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的。
  除了spring.jar文件,Spring还包括有其它13个独立的jar包,各自包含着对应的Spring组件,用户可以根据自己的需要来选择组合自己的jar包,而不必引入整个spring.jar的所有类文件。

注:spring3开始jar包不再包含全能的spring.jar了,而是分成20多个jar包了,配置可以按需引入了

(1) spring-core.jar

这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。

(2) spring-beans.jar

这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency InjectionIoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jarspring- beans.jar文件就可以了。

(3) spring-aop.jar

这个jar文件包含在应用中使用Spring AOP特性时所需的类。使用基于AOPSpring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。

(4) spring-context.jar

  这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如VelocityFreeMarkerJasperReports集成的类,以及校验Validation方面的相关类。

(5) spring-dao.jar

  这个jar文件包含Spring DAOSpring Transaction进行数据访问的所有类。为了使用声明型事务支持,还需在自己的应用里包含spring-aop.jar

(6) spring-hibernate.jar

  这个jar文件包含SpringHibernate 2Hibernate 3进行封装的所有类。

(7) spring-jdbc.jar

  这个jar文件包含对Spring JDBC数据访问进行封装的所有类。

(8) spring-orm.jar

  这个jar文件包含Spring DAO特性集进行了扩展,使其支持 iBATISJDOOJBTopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包。

(9) spring-remoting.jar

  这个jar文件包含支持EJBJMS、远程调用RemotingRMI HessianBurlapHttp InvokerJAX-RPC)方面的类。

(10) spring-support.jar

  这个jar文件包含支持缓存Cacheehcache)、JCAJMX、邮件服务(Java MailCOS Mail)、任务计划SchedulingTimerQuartz)方面的类。

(11) spring-web.jar

  这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、 StrutsJSF集成类、文件上传的支持类、Filter类和大量工具辅助类。

(12) spring-webmvc.jar

这个jar文件包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarkerJasperReportsTilesVelocity XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。

(13) spring-mock.jar

  这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟HttpServletRequestHttpServletResponse类在Web应用单元测试是很方便的。

  如何选择这些发布包,决定选用哪些发布包其实相当简单。如果你正在构建Web应用并将全程使用Spring,那么最好就使用单个全部的 spring.jar文件;如果你的应用仅仅用到简单的Inversion of Control / Dependency InjectionIoC/DI)容器,那么只需spring-core.jarspring-beans.jar即可;如果你对发布的大小要求很高,那么就得精挑细选了,只取包含自己所需特性的jar文件了。采用独立的发布包你可以避免包含自己的应用不需要的全部类。当然你可以采用其它的一些工具来设法令整个应用包变小,节省空间的重点在于准确地找出自己所需的Spring依赖类,然后合并所需的类与包就可以了。Eclispe有个插件叫 ClassPath Helper可以帮你找找所依赖的类。

Spring包依赖说明:

1) spring-core.jarcommons-collections.jarspring-core.jar是以下其它各个的基本。

2) spring-beans.jarspring-core.jarcglib-nodep-2.1_3.jar

3) spring-aop.jarspring-core.jarspring-beans.jarcglib-nodep-2.1_3.jaraopalliance.jar

4) spring-context.jarspring-core.jarspring-beans.jarspring-aop.jarcommons-collections.jaraopalliance.jar

5) spring-dao.jarspring-core.jarspring-beans.jarspring-aop.jarspring-context.jar

6) spring-jdbc.jarspring-core.jarspring-beans.jarspring-dao.jar

7) spring-web.jarspring-core.jarspring-beans.jarspring-context.jar

8) spring-webmvc.jarspring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar

9) spring -hibernate.jarspring-core.jarspring-beans.jarspring-aop.jarspring- dao.jarspring-jdbc.jarspring-orm.jarspring-web.jarspring-webmvc.jar

10) spring-orm.jarspring-core.jarspring-beans.jarspring-aop.jarspring- dao.jarspring-jdbc.jarspring-web.jarspring-webmvc.jar

11) spring -remoting.jarspring-core.jarspring-beans.jarspring-aop.jarspring- dao.jarspring-context.jarspring-web.jarspring-webmvc.jar

12) spring-support.jarspring-core.jarspring-beans.jarspring-aop.jarspring-dao.jarspring-context.jarspring-jdbc.jar

13) spring-mock.jarspring-core.jarspring-beans.jarspring-dao.jarspring-context.jarspring-jdbc.jar

 

转自: http://blog.csdn.net/huiwenjie168/article/details/8477837

 Posted by at 上午10:16  Tagged with: