转摘自: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:

  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依赖里的添加项为:

  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的库,例如:

  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里即可:

  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也可以引用,但是需要首先在本地安装,当前工程是便携的,但是直接引用而未如上声明的工程可能不是便携的。

在Maven中怎么配置外部Jar的更多相关文章

  1. 将eclipse java程序打包成jar的总结(包括工程中没有引用外部jar包和有引用外部jar包两种情况)

    一.当eclispe java工程中没有引用外部jar包时: 选中工程---->右键,Export...--->Java--->JAR file--->next-->填写 ...

  2. spring boot:在项目中引入第三方外部jar包集成为本地jar包(spring boot 2.3.2)

    一,为什么要集成外部jar包? 不是所有的第三方库都会上传到mvnrepository, 这时我们如果想集成它的第三方库,则需要直接在项目中集成它们的jar包, 在操作上还是很简单的, 这里用luos ...

  3. maven中如果使用本地jar

    1.安装到本地仓库class12.jar这个东西在中央仓库里没有,所以,cmd到oracle\product\10.2.0\db_1\jdbc\lib路径下,mvn install 就好了(发布第三方 ...

  4. IntelliJ IDEA14.1中java项目Maven中没有配置JDK时的问题

    在IntelliJ IDEA 14.1中使用在java项目中使用Maven时当没有在Maven中配置JDK编译版本.源码版本时,IDEA将默认的编译版本.源码版本设置为jdk5. 在IDEA中Lang ...

  5. maven中Rhino classes (js.jar) not found - Javascript disabled的处理

    想使用单元测试 来测一下服务请求,于是想到了使用Junit,查了一下,决定使用 HttpUnit 来发送请求 于是在maven中引入了 <dependency> <groupId&g ...

  6. Maven中手动引用第三方jar包

    有些jar包在Maven库中并不支持,但我们又需要.所以就必须手动引入. 可分为三步完成: 1 ,在项目目录下创建Lib,把引入的jar包加入. 2.在pom.xml中引入dependences. 如 ...

  7. maven中把依赖的JAR包一起打包(转)

    转自:http://lvjun106.iteye.com/blog/1849803 这里所用到的MAVEN-PLUGIN是MAVNE-ASSEMBLY-PLUGIN 官方网站是:http://mave ...

  8. maven中添加json-lib的jar包

    在maven配置文件pom.xml中添加如下配置信息: <dependency> <groupId>net.sf.json-lib</groupId> <ar ...

  9. maven中把依赖的JAR包一起打包

    <buizld> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId ...

随机推荐

  1. DESCRIBEFIELD

    実行時データ型識別.略語は RTTI です.プログラム実行時にデータ型を識別して処理を行う仕組みです.. DESCRIBE FIELD命令を使用 DESCRIBE FIELD命令を使用して.変数のデー ...

  2. 数据库 MySQL part2

    表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...

  3. C# 控制台应用程序输出颜色字体

    最佳解决方案的代码: static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; Console.W ...

  4. C++11中std::forward的使用

    std::forward argument: Returns an rvalue reference to arg if arg is not an lvalue reference; If arg ...

  5. Java Swing 图形界面开发(目录)

    Java Swing 图形界面开发(目录) 2017年05月30日 23:50:42 阅读数:5228 本文链接: http://blog.csdn.net/xietansheng/article/d ...

  6. SVN 使用时的小错误

    在使用SVN的时候总是出现一些小问题,今天又出现了一个,诶,分享一下吧!  Error:(个人文件夹名http://www.qdjhu.com/anli_xq/f_wancheng.php)  is ...

  7. PAT——乙级1015/甲级1062:德才论

    这两个题是一模一样的 1015 德才论 (25 point(s)) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德 ...

  8. WebSocket 与 HTTP/2

    个人笔记 WebSocket WebSocket 是一个双向通信协议,它在握手阶段采用 HTTP/1.1 协议(暂时不支持 HTTP/2). 握手过程如下: 首先客户端向服务端发起一个特殊的 HTTP ...

  9. HDU 4441 Queue Sequence(优先队列+Treap树)(2012 Asia Tianjin Regional Contest)

    Problem Description There's a queue obeying the first in first out rule. Each time you can either pu ...

  10. spring-data-jpa 简单使用心得

    对于总是使用mybatis的我,突发奇想的想使用spring-data-jpa搭一个小环境,这几天处处碰壁,现总结如下: 环境采用springboot maven需要导入: <dependenc ...