- 浏览: 558283 次
- 性别:
文章分类
- 全部博客 (337)
- WEB前端@HTML (4)
- WEB前端@CSS (5)
- WEB前端@javascript (31)
- WEB前端@DHTML (8)
- WEB前端@jQuery (3)
- WEB前端@Flex4 (19)
- WEB前端@BootStrap3 (21)
- 数据交换@JSON (1)
- 模板标签@JSTL (1)
- 模板标签@Thymeleaf (1)
- 模板标签@XSL-FO (3)
- WEB后台@JavaSE (75)
- WEB后台@JAX-WS (27)
- WEB后台@HttpClient (0)
- WEB后台@SSO (2)
- 框架@Spring3 (3)
- 框架@spring_MVC (8)
- 框架@Hibernate (26)
- 框架@play framework (18)
- 框架@sl4j (4)
- 数据库@ (2)
- 数据库@JDBC (0)
- 服务器@Linux (14)
- 服务器@Tomcat (2)
- 第三方jar@dom4j (1)
- 第三方jar@POI (2)
- 第三方jar@CXF (5)
- 项目管理@Maven (22)
- 项目管理@SVN (1)
- 缓存管理@ehcache (1)
- 系统设计@设计模式 (10)
- 单元测试@JunitTest (1)
- 开发工具 (3)
- BUG收录 (1)
- 学习之路 (6)
- 面试之道 (1)
- 我的项目 (2)
最新评论
-
superich2008:
logback配置文件的改动会导致应用重新加载,多改动几次后就 ...
Chapter 3: Logback configuration -
chenzhihui:
不是可以在log4j中配置以控制台或者文件方式保存日志的?
play记录日志 -
smilease:
很棒,正缺这个,非常感谢
bootstrap3-typeahead 自动补全 -
guangling13345:
[size=x-small][/size]
二级联动菜单 -
jacksondesign:
有,和YAML的格式有关,不知道有没有什么好的YAML格式的验 ...
(四)play之yabe项目【页面】
依赖的查询
硬依赖
指的就是必须由本模块来引入的依赖
传递依赖
当引入其它模块时,由于其它模块中已经有了某些jar包的依赖了,将自动把依赖关系导入到本模块
如,A模块已经配置了对hibernate的依赖,
当B模块中引入A模块的依赖时,hibernate的依赖将自动传入到B模块中。
此时,B模块中不用再配置hibernate的依赖了,会根据传递过来的依赖自动导入那些jar包!
依赖排除
由于有了传递性依赖的特征,当不想导入当前所引入的模块的依赖时,可以使用排除策略,将对应的依赖排除掉。
==================================================================
硬依赖
user-core模块
该模块用于定义实体类,需要的依赖的jar包:hibernate, mysql-connector, log4j, junit
依赖包的说明:
mysql-connector用来使用Java连接Mysql数据库
hibernate用来持久化对象
junit用来做单元测试
log4j用来做日志
依赖包的坐标通过上面的网址进行查询即可
则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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gc.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>user-core</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.6.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies> </project>
==================================================================
传递依赖
user-dao模块
本模块主要功能是对对象进行持久化操作,当然就离不开hibernate的支持。
由于该模块需要使用到user-core模块中的实体,那么就需要引入user-core模块
那么,user-core模块就需要进行发布(deploy),当发布到私服上,本地就可以下载到该模块的jar包了
注意:
user-core模块中已经依赖了hibernate的jar包,当user-dao模块引入user-core模块时,
user-dao模块就不需要在pom.xml中配置对hibernate的依赖了,因为依赖会传递!
当然,由于user-core模块中对mysql-connector, log4j都有依赖,那么本模块也会自动引入它们!
注意:
依赖传递需要明确的两点:
1.依赖是否传递由scope来决定
2.传递的是依赖关系,而不是将jar包从A模块拷贝到B模块
由于Junit的scope定义为了test,所以该依赖关系不会传递到另一个模块中,
所以,本模块中如果要使用Junit,那么还需要配置对Junit的依赖!
本模块中的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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gc.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>user-dao</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! --> <dependency> <groupId>com.gc.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
依赖的scope属性
决定该依赖是否传递,是否被打入war包
scope=compile,默认范围,该范围的依赖传递最强,编译,打包,运行都需要;
scope=test,依赖不会传递,生成war包时不会导入;测试包不需要传递,也不需要打入到war包。
scope=provided,依赖不会传递,生成war包时不会导入。仅编译,测试时有用,与test范围有点类似,但是出发点不一样。如servlet-api,容器已经提供了,就不能再包含了,否则,会导致包冲突等异常发生。
scope=runtime,编译时没有依赖,运行时有依赖
scope=system,导入本地jar包,通过指定本地路径来导入
scope=import
依赖传递的冲突
本模块依赖其它几个模块,而这几个模块中对某个jar包的依赖版本不同,那么本模块将使用哪个依赖呢?
Maven将自动根据"最短路径原则"来确定!
最短路径原则:
如果本地显示依赖了某个jar包,则用本地的;
如果本地没有显示依赖,而是通过依赖传递依赖的某个jar包:
首先根据最短依赖原则确定;
如果路径长度都相同,则根据依赖书写顺序确定;
依赖的排除
Maven基于最短路径原则,解决了依赖冲突的问题,我们还可以通过依赖排除来进一步干涉依赖的传递行为。
如,引入user-core时,我不想使用user-core关于log4j的依赖,那么在引入user-core的时候,声明需要排除的依赖即可:
<!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! --> <dependency> <groupId>com.gc.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <!-- 排除user-core模块中关于log4j的依赖 --> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
依赖的显示声明,精确控制依赖的版本
基于Maven的最短路径原则解决了多个相同依赖冲突的问题
依赖排除又提供了一种依赖冲突的解决方案
此外,我们还可以直接在本模块中声明对某个jar包的依赖,优先级最高,冲突也就自动解决了
==================================================================
评论
2 楼
schy_hqh
2013-11-06
小哥你好,我有大半年没接触Struts2开发了,具体情况不了解。
我认为有2种途径可以解决:
1.IDE提供了依赖树,不知道你用的是什么IDE,它可以看jar包是由哪个依赖导致引入的;
2.删除pom中引入的依赖,比如声明的与struts2相关的依赖,删掉一个后,maven后立即更新reference,如果junit-plugin消失了,那就是刚删的那个依赖导致的。
我认为有2种途径可以解决:
1.IDE提供了依赖树,不知道你用的是什么IDE,它可以看jar包是由哪个依赖导致引入的;
2.删除pom中引入的依赖,比如声明的与struts2相关的依赖,删掉一个后,maven后立即更新reference,如果junit-plugin消失了,那就是刚删的那个依赖导致的。
1 楼
mojinchuan
2013-11-06
现在我的工程里打war包出现了这个包:struts2-junit-plugin-2.1.8.1.1.jar,但是pom.xml没有直接配置,请问我怎么知道是哪个模块的传递依赖
发表评论
-
解决Maven下载dependency慢的问题
2013-12-29 22:37 4075使用NEXUS作为私服,如果下载jar或者插件很慢,甚 ... -
手动发布一个jar包到私服
2013-11-08 11:39 1256安装到本地库:mvn install:install-f ... -
Jetty插件
2013-10-09 11:02 0Jetty插件在Maven中的配置 <plu ... -
Maven上传构建到私服(NEW)
2013-10-04 17:28 2044为私服添加上传构建的账户 添加用户上传构建到NEXUS私服的 ... -
Maven使用过程中遇到的问题(NEW)
2013-10-04 10:54 754Project configuration is not u ... -
Maven的属性(NEW)
2013-10-04 09:13 506maven的属性 env.X: 操作系统环境变量,比 ... -
Maven的聚合、继承(NEW)
2013-10-03 12:44 2121模块的聚合 聚合的好处: 统一对各个模块的编译 ... -
Maven的生命周期和插件(NEW)
2013-10-02 17:32 2160不同版本的插件,功能有可能不同,有些配置在某些版本中根本 ... -
Maven的本地仓库、中心仓库、私服(NEW)
2013-10-02 17:30 16532本地仓库 设置本地仓库到指定目录,而不使用Maven默认的 ... -
创建Maven项目(NEW)
2013-10-02 17:24 616第一种,在CMD命令行创建Maven项目 CMD命令行中 ... -
Maven的安装、项目结构、POM文件解读(NEW)
2013-10-02 15:04 1644第一步,下载Maven http://maven.apa ... -
使用JAX-WS的maven插件发布webservice
2013-08-11 21:26 20161.引入插件过程中,提示miss jar的问题,换中心仓库 ... -
发布项目到jetty/tomcat
2013-08-11 12:35 2316将maven管理的web模块发布到jetty服务器中 st ... -
(九)maven发布WEB项目
2013-07-14 19:28 10511.编写POM <project xmlns=& ... -
(八)maven的插件使用
2013-07-14 14:18 7741.超级POM中配置插件 <!-- 插件 -- ... -
(七)maven仓库-分仓库管理项目
2013-07-14 10:01 942新建仓库---分仓库管理项目 使用nexus管理多个项目的时候 ... -
(六)maven项目发布
2013-07-14 09:04 4781.配置项目发布到仓库的位置(配置SNAPSHOT和relea ... -
(五)Nexus 私服
2013-07-13 16:05 12941.下载nexus,配置环境变 ... -
(四)maven的聚合和继承
2013-07-13 13:17 7801.聚合 在一个POM文件中完成所有模块的编译,打包工作, ... -
(三)maven依赖包
2013-07-13 10:50 11041.eclipse中创建maven项目 打开POM.xml , ...
相关推荐
然后,将Maven项目上传至trunk目录,注意排除不需要提交的文件(如target目录、Eclipse配置文件等)。在本地安装Subversion客户端,并确保其bin目录添加到PATH环境变量中。通过命令行使用SVN命令进行代码的提交、...
`implementation`是依赖类型,意味着这个库只在应用运行时使用,不会被传递到其他依赖你的库。 2. **Maven Central仓库**: 大多数流行的开源Android库都会发布到Maven Central仓库。当我们写入依赖时,Gradle会...
通常,它会包含如何添加上述Maven依赖的步骤,以及可能的额外配置,如自定义版本或排除某些传递性依赖。 总的来说,Zip4j是一个非常实用的Java库,其易用性和强大的功能使得在Java开发中处理ZIP文件变得简单。通过...
- `spring-boot-starter-test`:测试相关的依赖,但排除了`junit-vintage-engine`,可能是为了避免与JUnit5的冲突。 2. **WebSocket配置**: 在Spring Boot应用中,我们需要创建一个WebSocket配置类,启用...
3. **排除冲突**:在`build.gradle`文件中排除冲突的依赖部分。 例如,如果你确定某个依赖包中的`gson`不是你需要的版本,可以这样排除它: ```gradle dependencies { compile ('com.example:some-library:1.0.0'...
这会排除指定库在传递性依赖中的版本。 然后,理解版本控制。在Android开发中,经常需要更新第三方库以获取最新功能和修复。Gradle允许你使用`+`号来指定最新版本,或者使用`~>`操作符指定最小版本并自动获取小版本...
这个插件通常包含在Struts2的核心库中,如果没有,可以单独下载或在Maven或Gradle的依赖配置中添加。 在Struts2的配置文件(struts.xml或struts-default.xml)中,我们需要开启JSON支持。可以通过以下配置实现: `...
- 对于使用Maven或Gradle的项目,还需要在构建配置中添加Lombok的依赖。 以上就是关于Lombok在Eclipse或MyEclipse中的安装与使用方法,以及对`lombok.jar`的介绍。通过Lombok,开发者可以更专注于业务逻辑,减少...
要获取或修改元素属性,可以直接通过点操作符实现,如`element.attr("href")`获取`href`属性,`element.attr("href", "new-url")`设置`href`属性。 7. **遍历和操作元素** `Element`类提供了丰富的遍历和操作方法...
这通常意味着在Maven的pom.xml文件或构建脚本中添加相关的依赖。 2. **配置Action**:在你的Action类中,你需要定义一个方法来处理请求并返回JSON响应。这个方法应该有`@Action`注解,并设置`resultType`为`json`。...