Maven提供了多种依赖关系,这些依赖关系使用起来非常容易出错。这几天看到我们产品项目间的依赖关系使用相当混乱,所以花了几天时间研究了一把。
Maven提供多种项目依赖关系。
compile:这是缺省的依赖关系。不要被它的名字给迷惑了,它并不表示编译时依赖,而是所有都依赖。
provided:如果该库应用服务器提供了,就使用它。
test:只在单元测试使用。
还有其它几种,我觉得并不重要。
如果一个项目打包为Jar。那么根本不存在应用服务器这种情况,直接用缺省依赖关系compile即可。当然如果想更精细控制,向junit,hsqldb,mock这样的库一般可以作为test。
如果一个项目打包为war,ear。那么就应该把应用服务器提供的库给排除出去,即在该项目中添加这些库的依赖,依赖类型为provided。
下面是一个多项目产品的例子。
产品top-app。top-app包含下面4个项目,my-app,my-app2,my-app3,my-appwar。前面三个都是打成jar包。最后一个打成war包。所有子项目不能定义groupId,要不然可能会出错。
在top-app中定义产品测试用到的库,scope为test;定义应用服务器提供的库,scope为provided
具体定义如下
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
<groupId>com.mycompany.app</groupId>
-
<artifactId>top-app</artifactId>
-
<version>1.0</version>
-
<name>top-app</name>
-
<packaging>pom</packaging>
-
<modules>
-
-
<module>my-app</module>
-
<module>my-app2</module>
-
<module>my-app3</module>
-
<module>my-app3war</module>
-
</modules>
-
-
<dependencies>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>3.8.1</version>
-
<scope>test</scope>
-
</dependency>
-
<dependency>
-
<groupId>log4j</groupId>
-
<artifactId>log4j</artifactId>
-
<version>1.2.9</version>
-
<scope>provided</scope>
-
</dependency>
-
</dependencies>
-
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>top-app</artifactId>
<version>1.0</version>
<name>top-app</name>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-app2</module>
<module>my-app3</module>
<module>my-app3war</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
my-app,my-app2,my-app3中只需要定义真正需要的。scope都为缺省即compile。如果项目单独添加了特别的测试用的库,那么加为test依赖,不过用compile也没有问题。
my-app2的pom.xml示例如下。
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
<artifactId>my-app2</artifactId>
-
<packaging>jar</packaging>
-
<version>1.0</version>
-
<name>my-app2</name>
-
<parent>
-
<groupId>com.mycompany.app</groupId>
-
<artifactId>top-app</artifactId>
-
<version>1.0</version>
-
</parent>
-
<dependencies>
-
<dependency>
-
<groupId>com.mycompany.app</groupId>
-
<artifactId>my-app</artifactId>
-
<version>1.0</version>
-
<scope>compile</scope>
-
</dependency>
-
</dependencies>
-
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my-app2</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>my-app2</name>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>top-app</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
my-appwar中也只需要定义真正需要的。scope也都为缺省即compile,因为在top-app中已经定义了应用服务器提供的库,打包的时候maven不会打进去。
示例代码见附件。
分享到:
相关推荐
一些Java应用程序都有依赖性,不可以在一个公共Maven存储库。本文档向您展示了如何在应用程序中添加这些库项目,告诉Maven如何找到他们…
主要介绍了Intellij IDEA中如何查看maven项目中所有jar包的依赖关系图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
maven项目搭建 依赖、继承、聚合关系
介绍如何使用 Maven 管理项目的依赖关系,以及如何通过声明式配置来简化项目的构建和管理。强调 Maven 的生命周期和插件机制,以及如何使用插件扩展 Maven 的功能。 第三部分:Maven 的优势和应用 探讨 Maven 在...
MavenRunHelper插件的作用是帮助用户更轻松地在InteliJ IDEA中运行maven项目,它可以自动配置Maven运行环境,并且可以自动识别 maven项目的依赖关系,从而节省时间和精力。
2、依赖管理:Maven能够自动解决项目的依赖关系,你只需要在pom.xml中声明你的项目依赖的库和版本号,Maven会自动下载并管理这些依赖。 3、项目生命周期管理:Maven提供了一系列的构建阶段(如编译、测试、打包、...
Maven基于项目对象模型(Project Object Model,POM)来管理项目,通过定义一系列规范化的目录结构和配置文件来管理项目的构建过程和依赖关系。Maven的主要作用是提高Java项目的可维护性、可重用性和可扩展性。
Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包
Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包,,这个pom.xml包我后面会叙述,不过已经学习过maven的 人应该对这个很熟悉。其本质就是通过配置pom....
本文面向具有eclipse相关开发经验的...5. 依赖关系 20 5.1 第三方依赖 20 5.2 本地工程依赖 25 6. 遇到问题 31 6.1 新建工程的问题 31 6.2 编译工程的问题 34 6.3 解决Maven不断更新资源的问题 35 6.4 其它 37
第5章:坐标和依赖/5.9 最佳实践/5.9.3 依赖关系查看 第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/6.3 仓库的分类/6.3.1 本地仓库 第6章:仓库/6.3 仓库的...
创建的maven web项目所需要的依赖关系,每条依赖关系标注了作用和如果不加这条依赖会出现的错误,亲测可靠!
在我们做Java项目的时候,往往最困难的就是如何启动项目。项目启动之前,我们要配置好所有的逻辑关系。...构建一个Java项目可以使用很多工具,相信许多组织必须在 Apache Ant 和 Apache Maven 之间做一个选择。
struts2-core-2.3.16.3.jar还依赖其它的jar包,依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。 1.3、使用Maven的好处 ...
一个简单的Maven项目 3.1. 简介 3.1.1. 下载本章的例子 3.2. 创建一个简单的项目 3.3. 构建一个简单的项目 3.4. 简单的项目对象模型 (Project Object Model) 3.5. 核心概念 3.5.1. Maven插件和目标 ...
### 一、Maven是什么 ...④一个jar包依赖的其他jar包需要自己手动加入到项目中,如果所有的jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本 而Maven会自动将被依赖的jar包导入进来
通过在POM中指定依赖项的坐标,Maven可以自动解析依赖关系,并从中央仓库或自定义仓库中下载所需的JAR包。 约定优于配置: Maven遵循“约定优于配置”的原则,即在大多数情况下,它会根据标准的项目结构和约定来...
MavenRunHelper,用于进行maven项目jar包依赖关系以及冲突情况查看的工具类