zoukankan      html  css  js  c++  java
  • 在Maven中怎么配置外部Jar

    转摘自:http://liugang594.iteye.com/blog/1677712


    假设我们有一个Maven的project,其中有些Jar包不是来自Maven库的,是存在本地的某些Jar文件,比如说在project下有一个lib,里面放了一些额外需要的Jar。

     

    默认情况下,如果用mvn 命令去编译或运行它,并且其中有使用到这些外部jar的类,那么可能报x.x.x包找不着。这是因为maven在它当前的配置里找不到你需要的这些外部jar的配置。

     

    那么如何在maven中配置外部jar,以便在编译和运行的时候能找着它们呢?这里就简单介绍两种方法。

     

    一、使用Dependency声明

     

    这个方法就是和其他maven的dependency一样,在pom.xml里声明一个dependency:

     

     

    Xml代码  收藏代码
    1. <dependency>  
    2.     <groupId>org.ibm</groupId>  
    3.     <artifactId>jms</artifactId>  
    4.     <version>1.0.0</version>  
    5.     <scope>system</scope>  
    6.     <systemPath>${project.basedir}/lib/jms.jar</systemPath>  
    7. </dependency>  

    细心的人可能已经留意到了,这里多了两个声明:scope和systemPath。

     

    在Maven中可用的声明大致有:compile, runtime, test, system, 和 provided 。关于他们的具体意思,有兴趣的可以去 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope 看。

     

    在上面的dependency里,我们声明了scope为system, 它使用起来和provided差不多,即此依赖由系统提供,但是与provided有点不同的是,它需要显式的使用systemPath指定lib所在的路径,如上systemPath。

     

    最后看到的效果如上图,jms.jar被加到了工程的maven依赖里。用这种方法可以不需要预先把需要的jar安装在maven库下。

     

    二、创建一个Project范围的库

    以上的方法是从避免安装lib到maven库方向上实现。另一种方法就是则是从构造库的方向上考虑的:创建一个虚拟的本地库,让maven到这个本地库里去查找需要的lib。

     

    步骤大致如下:

    1. 构造虚拟Maven库

     

    这里我们需要提供一个和maven库结构一样的文件夹/文件结构,以模拟Maven库,例如假如project里lib即是一个maven库,则它的结构可能是:

     

    如上,虚拟库中声明了两个jar:

    1. com.ibm.mq-1.0.jar       : groupId 是 org.ibm.jms;artifactId是com.ibm.mq;version是1.0

    2. com.ibm.mqjms-1.0.jar : groupId是org.ibm.jms;artifactId是com.ibm.mqjms;version是1.0

     

    假设以上jar是可用的maven依赖的话,那在dependency依赖里的添加项为:

    Xml代码  收藏代码
    1. <dependency>  
    2.     <groupId>org.ibm.jms</groupId>  
    3.     <artifactId>com.ibm.mqjms</artifactId>  
    4.     <version>1.0</version>  
    5. </dependency>  
    6. <dependency>  
    7.     <groupId>org.ibm.jms</groupId>  
    8.     <artifactId>com.ibm.mq</artifactId>  
    9.     <version>1.0</version>  
    10. </dependency>  

     

    下面的问题就是如何让Maven能找到这个虚拟Maven库。

     

    在pom.xml里,我们使用repositories声明可能查找的、多个其他的Maven的库,例如:

    Xml代码  收藏代码
    1. <repositories>  
    2.   <repository>  
    3.     <releases>  
    4.       <enabled>false</enabled>  
    5.       <updatePolicy>always</updatePolicy>  
    6.       <checksumPolicy>warn</checksumPolicy>  
    7.     </releases>  
    8.     <snapshots>  
    9.       <enabled>true</enabled>  
    10.       <updatePolicy>never</updatePolicy>  
    11.       <checksumPolicy>fail</checksumPolicy>  
    12.     </snapshots>  
    13.     <id>codehausSnapshots</id>  
    14.     <name>Codehaus Snapshots</name>  
    15.     <url>http://snapshots.maven.codehaus.org/maven2</url>  
    16.     <layout>default</layout>  
    17.   </repository>  
    18. </repositories>  

     

    当Maven在Central库里没有找到对应的artifact,则会到这些库里去查找。所以,我们只需要如上把虚拟的Maven库的定义的添加到pom.xml里即可:

    Xml代码  收藏代码
    1. <repositories>  
    2.     <repository>  
    3.         <id>repo</id>  
    4.         <releases>  
    5.             <enabled>true</enabled>  
    6.             <checksumPolicy>ignore</checksumPolicy>  
    7.         </releases>  
    8.         <snapshots>  
    9.             <enabled>false</enabled>  
    10.         </snapshots>  
    11.         <url>file://${project.basedir}/lib</url>  
    12.     </repository>  
    13. </repositories>  

    这里库的路径是:${project.basedir}/lib 。它是一个release库而不是snapshot库。

     

    区别

    方式一:会直接引用指定路径的lib,而不会把它加到本地的Maven库里去,所以它只在当前project使用,但工程可以方便的共享,且不使用额外的空间

    方式二:引用的jars会首先被安装到本地的maven库里,然后再通过引用从本地的Maven库里加载,好处是一旦安装,在其他的project也可以引用,但是需要首先在本地安装,当前工程是便携的,但是直接引用而未如上声明的工程可能不是便携的。

  • 相关阅读:
    Spring AOP 注解开发
    AOP的专业术语
    Java自定义注解的实现和应用
    Spring 声明式事务管理
    另一种线程安全机制:在事务管理中起到巨大作用的 ThreadLocal
    MySQL的二级索引
    数据库的范式化和反范式化
    MySQL为表字段添加索引
    mysql索引(二)----如何高效使用索引
    Alexnet网络
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637214.html
Copyright © 2011-2022 走看看