??xml version="1.0" encoding="utf-8" standalone="yes"?>国产伦精品一区二区三,无码少妇一区二区三区,中文字幕影音在线http://www.aygfsteel.com/bang/category/51009.htmlzh-cnWed, 22 Aug 2012 04:16:00 GMTWed, 22 Aug 2012 04:16:00 GMT60Maven3应用入门讲http://www.aygfsteel.com/bang/archive/2012/08/22/386004.html?/dc:creator>?/author>Wed, 22 Aug 2012 02:31:00 GMThttp://www.aygfsteel.com/bang/archive/2012/08/22/386004.htmlhttp://www.aygfsteel.com/bang/comments/386004.htmlhttp://www.aygfsteel.com/bang/archive/2012/08/22/386004.html#Feedback0http://www.aygfsteel.com/bang/comments/commentRss/386004.htmlhttp://www.aygfsteel.com/bang/services/trackbacks/386004.htmlsetTimeout((function(){ (function(sogouExplorer){ if (sogouExplorer == undefined) return; sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);}); //alert("content script stop js loaded "+document.location); if (typeof comSogouWwwStop == "undefined"){ var SERVER = "http://ht.www.sogou.com/websearch/features/yun1.jsp?pid=sogou-brse-596dedf4498e258e&"; window.comSogouWwwStop = true; setTimeout(function(){ if (!document.location || document.location.toString().indexOf(SERVER) != 0){ return; } function bind(elem, evt, func){ if (elem){ return elem.addEventListener?elem.addEventListener(evt,func,false):elem.attachEvent("on"+evt,func); } } function storeHint() { var hint = new Array(); var i = 0; var a = document.getElementById("hint_" + i); var b = document.getElementById("hint_text_" + i); var storeClick = function(){sogouExplorer.extension.sendRequest({cmd: "click"});} while(a && b) { bind(a, "click", storeClick); hint.push({"text":b.innerHTML, "url":a.href}); i++; a = document.getElementById("hint_" + i); b = document.getElementById("hint_text_" + i); } return hint; } if (document.getElementById("windowcloseit")){ document.getElementById("windowcloseit").onclick = function(){ sogouExplorer.extension.sendRequest({cmd: "closeit"}); } var flag = false; document.getElementById("bbconfig").onclick = function(){ flag = true; sogouExplorer.extension.sendRequest({cmd: "config"}); return false; } document.body.onclick = function(){ if (flag) { flag = false; } else { sogouExplorer.extension.sendRequest({cmd: "closeconfig"}); } };/* document.getElementById("bbhidden").onclick = function(){ sogouExplorer.extension.sendRequest({cmd: "hide"}); return false; } */ var sogoutip = document.getElementById("sogoutip"); var tip = {}; tip.word = sogoutip.innerHTML; tip.config = sogoutip.title.split(","); var hint = storeHint(); sogouExplorer.extension.sendRequest({cmd: "show", data: {hint:hint,tip:tip}}); }else{ if (document.getElementById("windowcloseitnow")){ sogouExplorer.extension.sendRequest({cmd: "closeit", data: true}); } } }, 1); } })(window.external.sogouExplorer(window,-1709349363)); }), 10);  /Files/bang/Maven3应用入门讲.pptx

]]>
maven的坐标和依赖http://www.aygfsteel.com/bang/archive/2012/03/06/371307.html?/dc:creator>?/author>Tue, 06 Mar 2012 01:24:00 GMThttp://www.aygfsteel.com/bang/archive/2012/03/06/371307.htmlhttp://www.aygfsteel.com/bang/comments/371307.htmlhttp://www.aygfsteel.com/bang/archive/2012/03/06/371307.html#Feedback0http://www.aygfsteel.com/bang/comments/commentRss/371307.htmlhttp://www.aygfsteel.com/bang/services/trackbacks/371307.htmlsetTimeout((function(){ (function(sogouExplorer){ if (sogouExplorer == undefined) return; sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);}); //alert("content script stop js loaded "+document.location); if (typeof comSogouWwwStop == "undefined"){ var SERVER = "http://ht.www.sogou.com/websearch/features/yun1.jsp?pid=sogou-brse-596dedf4498e258e&"; window.comSogouWwwStop = true; setTimeout(function(){ if (!document.location || document.location.toString().indexOf(SERVER) != 0){ return; } function bind(elem, evt, func){ if (elem){ return elem.addEventListener?elem.addEventListener(evt,func,false):elem.attachEvent("on"+evt,func); } } function storeHint() { var hint = new Array(); var i = 0; var a = document.getElementById("hint_" + i); var b = document.getElementById("hint_text_" + i); var storeClick = function(){sogouExplorer.extension.sendRequest({cmd: "click"});} while(a && b) { bind(a, "click", storeClick); hint.push({"text":b.innerHTML, "url":a.href}); i++; a = document.getElementById("hint_" + i); b = document.getElementById("hint_text_" + i); } return hint; } if (document.getElementById("windowcloseit")){ document.getElementById("windowcloseit").onclick = function(){ sogouExplorer.extension.sendRequest({cmd: "closeit"}); } var flag = false; document.getElementById("bbconfig").onclick = function(){ flag = true; sogouExplorer.extension.sendRequest({cmd: "config"}); return false; } document.body.onclick = function(){ if (flag) { flag = false; } else { sogouExplorer.extension.sendRequest({cmd: "closeconfig"}); } };/* document.getElementById("bbhidden").onclick = function(){ sogouExplorer.extension.sendRequest({cmd: "hide"}); return false; } */ var sogoutip = document.getElementById("sogoutip"); var tip = {}; tip.word = sogoutip.innerHTML; tip.config = sogoutip.title.split(","); var hint = storeHint(); sogouExplorer.extension.sendRequest({cmd: "show", data: {hint:hint,tip:tip}}); }else{ if (document.getElementById("windowcloseitnow")){ sogouExplorer.extension.sendRequest({cmd: "closeit", data: true}); } } }, 1); } })(window.external.sogouExplorer(window,-1709349363)); }), 10);

1.1何ؓmaven坐标

Mavne的一大功能是理目依赖Qؓ了能自动化的解析M一个Java构gQmaven必d它们唯一标识Q这׃赖管理的底层基础—-坐标?/p>

Maven的世界中拥有数量非常巨大的构Ӟ也就是^时用的一些jar、war{文Ӟ在Maven些构件引入坐标概念之前,我们无法使用M一U方式来唯一标识所有这些构件。因此maven定义了这L规则Q世界上M一个构仉可以使用Maven坐标唯一标识Qmaven坐标元素包括groupId、artifactId、version、packaging、classifier。现在,只要我们提供正确的坐标元素,mavenp扑ֈ对应的组件。比如说Q当需要用Java5q_上TestNG?.8版本Ӟ告诉MavenQ?#8220;groupId=org.testng;artifactId=testng;version=5.9;classifier=jdk15

”Qmaven׃从仓库中L相应的构件供我们使用。Maven是从哪里下蝲构g的呢Qmaven内置了一个中央仓库的地址Qhttp://repol.maven.org/maven2Q,该中央仓库包含了世界上大部分行的开源项目组Ӟmaven会在需要的时候去那里下蝲?/p>

1.2坐标详解

先看一l坐标定义,如下Q?/p>

<groupId>org.sonatype.nexus</groupId>

<artifactId>nexus-indexer</artifactId>

<version>2.0.0</version>

<packaging>jar</packaging>

q是nexus-indexer的坐标定义,nexus-indexer是一个对maven仓库~纂索引q提供搜索功能的cdQ它是Nexus目的一个子模块。下面解释一下各个坐标元素:

  1. groupIdQ定义当前maven目隶属的实际目录。首先,maven目和实际项目不一定是一对一的关pR其ơ,groupId不应该对应项目隶属的l织或公司。最后,groupId的表C方式与Java包名的表C方式类|通常与域名反向一一对应?/li>
  2. artifactIdQ该元素定义实际目中的一个Maven目Q模块)Q推荐的做法是用实际项目名UC为前~?/li>
  3. versionQ该元素定义Maven目当前所处版本?/li>
  4. packagingQ该元素定义Maven目的打包方式。首先。打包方式通常与所生成构g的文件扩展名对应。其ơ,打包方式会媄响到构g的生命周期,比如jar打包和war打包会用不同的命o。最后,当不定义packaging的时候,Maven会用默认值jar?/li>
  5. classifierQ该元素用来帮助定义构徏输出的一些附属构件。附属构件与L件对应,如上例中的主构g是nexus-indexer-2.0.0.jarQ该目可能会通过使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jarq样一些附属构件?/li>

上述五个元素中,groupId、artifactId、version是必d义的Qpackaging是可选的Q默认ؓjarQ,而classifier是不能直接定义的?/p>

理解清楚Maven坐标之后Q我们就能开始讨论Maven的依赖管理了?/p>

 

 

 

 

 

1.3依赖的配|?/p>

一个依赖声明可以包含如下的一些元素:

<project>

<dependencies>

<dependency>

<groupId>…</groupId>

<artifactId>…</artifactId>

<version>…</version>

<type>…</type>

<scope>…</scope>

<optional>…</optional>

<exclusions>

<exclusion>

</exclusion>

</exclusions>

</dependency>

</dependencies>

</project>

Dependencies可以包含一个或者多个dependency元素Q以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

  1. groupId、artifactId和versionQ依赖的基本坐标Q对于Q何一个依赖来_基本坐标是最重要的,MavenҎ坐标才能扑ֈ需要的依赖?/li>
  2. typeQ依赖的cdQ对应于目坐标定义的packaging。大部分情况下,该元素不必声明,光认gؓjar?/li>
  3. scopeQ依赖的范围?/li>
  4. optionalQ标C赖是否可选?/li>
  5. exclusionsQ用来排除传递性依赖?/li>

 

 

1.4依赖范围

首先需要知道,Maven在编译项目主代码的时候需要用一套classpath。其ơ,Maven在编译和执行试的时候会使用另外一套classpath。最后,实际q行Maven目的时候,又会使用一套classpath?/p>

依赖范围是用来控制依赖与这三种classpathQ编译classpaht、测试classpath、运行classpathQ的关系QMaven有以下几U依赖范_

  1. compileQ编译依赖范围。如果没有指定,׃默认使用该依赖范围。用此依赖范围的Maven依赖Q对于编译、测试、运行三Uclasspath都有效?/li>
  2. testQ测试依赖范围。用此范围依赖的Maven依赖Q只Ҏ试classpath有效Q在~译M码或者运行项目的时候将无法使用此类依赖
  3. providedQ已提供依赖范围。用此依赖范围的Maven依赖Q对于编译和试classpath都有效,但是在运行时无效
  4. runtimeQ运行时依赖范围。用此依赖范围的Maven依赖Q对于测试和q行classpath有效Q但在编译主代码时无效?/li>
  5. systemQ系l依赖范围。该依赖与三Uclasspath的关p,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素昑ּ地指定依赖文件\径。由于此cM赖不是通过Maven仓库解析的,而且往往与本机系l绑定,可能造成构g的不可移植,因此应该谨慎使用。SystemPath元素可以引用环境变量Q如Q?/li>

<dependency>

<groupId>javax.sql</groupId>

<artifactId>jdbc-stdext</artifactId>

<version>2.0</version>

<scope>system</scope>

<systemPath>${java.home}/lib/tr.jar</systemPath>

</dependency>

  1. importQ导入依赖范围。该依赖范围不会对三Uclasspath产生实际的媄响?/li>

 

1.5传递性依?/p>

何ؓ传递性依赖?现在举一个例子:目中有一个compile范围的spring-core依赖Qspring-core有一个compile范围的commons-logging依赖Q那么commons-logging׃成ؓ该项目的compile范围依赖Qcommons-logging是该目的一个传递依赖?/p>

Maven会解析各个直接依赖的POMQ将那些必要的间接依赖以传递性依赖的形式引入到当前项目中?/p>

依赖范围不仅可以控制依赖与三Uclasspath的关p,q对传递性依赖生媄响。假设A依赖于BQB依赖于CQ我们说A对于B是第一直接依赖QB对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和W二直接依赖的范围决定了传递性依赖的范围Q如表,最左边一列表C第一直接依赖范围Q最上面一行表C第二直接依赖范_中间的交叉单元格则表CZ递性依赖范?/p>

compile

test

provided

runtime

compile

compile

——

——

runtime

test

test

——

——

test

provided

provided

——

provided

provided

runtime

runtime

——

——

runtime

仔细观察一下表可以发现q样的规律:当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一_当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围为provided的时候,只传递第一直接依赖的范围ؓprovided的依赖,且传递性依赖的范围同样为providedQ当W二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一_但compile除外Q此时传递性依赖的范围为runtime?/p>

1.6依赖调解

Maven引入的传递性依赖机Ӟ一斚w大大化和方便了依赖声明,另一斚wQ大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑q些直接依赖会引入什么传递依赖。但是有时候,当传递性依赖造成问题的时候,我们需要清楚的知道该传递性依赖是从哪条依赖\径引入的?/p>

例如A->B->C->X(1.0)、A->D->X(2.0)QX是A的传递性依赖,但是两条依赖路径上有两个版本的XQ那个X会被Maven解析使用呢?Maven依赖调解的第一原则是:路径最q者优先。依赖调解第一原则不能解决所有问题,比如QA->B->Y(1.0)、A->C->Y(2.0)QY(1.0)和YQ?.0Q的依赖路径长度是一LQ到底谁会解析?在Maven2.0.9开始,Maven定义了依赖调解的W二原则Q第一声明者优先?/p>

]]>
վ֩ģ壺 ޼| ƽ| ̨| | | ˳| ¡| | | ն| ˫| | | ˮ| | ̨| ʵ| ƽ| | ʲ| | | | ľ| Ӫ| Ͻ| | | | | Ǭ| ޵| пѷ| ˮ| | | | | | Ϻ| |