dependency中的scope(dependency的scope import)
在 java ee ide 中maven dependency scope:provide不想让其deploy
provided (已提供范围),已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。eclipse里面scope的值拼写错了也不会有提示的。。。
maven的pom.xml中dependency标签下的scope标签的作用
目前scope可以使用5个值: * compile,缺省值,适用于所有阶段,会随着项目一起发布。 * provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 * runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 * test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 * system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
maven version是必须的吗
groupId,artifactId和version这个三组合标示依赖的具体工程,而且这个依赖工程必须是maven中心包管理范围内的。如果碰上非开源包,maven支持不了这个包,那么则有三种方法处理:1.本地安装这个插件install plugin例如:
mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1
2.创建自己的Repositories并且部署这个包,使用类似上面的deploy:deploy-file 命令3.设置scope为system,并且指定系统路径
dependency里面的classifier,用于区分从同一个pom编译出来的但是内容不同的同名包,例如同一个工程编译出两个artifact,一个支持jdk1.5一个支持jdk1.4,那么就可以使用这个来命名为jdk15和jdk14来区分,它如果出现在包名中,那么它必须跟在版本号后。还有一种情况是将一个工程的一些次要artifact附到主要artifact中,就可以使用这个来区分,例如一个工程产生source,javadoc,class三种东西,那么就可以使用不同的classifier来分别标识这些东西
dependency里面的type,默认为jar,类型,常用如:jar,ejb-client,test-jar,可以设置plugins中的extensions值为true后在增加新类型
dependency里面的scope,指定classpath,可以为:compile(默认的,compile scope在所有classpaths内有效,这些dependencies将会传播到项目中。provided:指示jdk或者某个容器可以提供他,它只在compilation和test的classpaths有效,而且不会传播的。runtime:指示这个dependency在编译过程是不必要的,但是执行需要,在test和runtime的classpaths有效,在compile的classpaths无效。test:指示这个dependency在一般程序运行是无效的,但是在test的compilation和execution是有效的,system则跟provided类似,但是这种dependency必须人工明确地制定。这种依赖不会在repository中查找。
dependency里面的systemPath:只在dependency的scope声明为system的时候才有用除,否则,build的过程将会失败。路径必须是绝对的,所以最好使用property来声明机器的特定路径。
dependency里面的optional:如果工程本身是一个dependency那么就标记为optional,例如X需要A,A需要B,那么X只需要optional的B,则B在X中就是optional声明的了
dependency里面的exclusions:如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion。optional是不会install或者使用B,而exclusion是将B从依赖树中是删除。例如appfuse不想使用hibernate,但是appfuse是集成hibernate的,所以就排除掉:
exclusions
exclusion
groupIdorg.appfuse/groupId
artifactIdappfuse-hibernate/artifactId
/exclusion
/exclusions--
maven的dependency中怎么指定本地的jar包
一、使用Dependency声明这个方法就是和其他maven的dependency一样,在pom.xml里声明一个dependency:org.ibmjms1.0.0system${project.basedir}/lib/jms.jar细心的人可能已经留意到了,这里多了两个声明:scope和systemPath。二、创建一个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.02.com.ibm.mqjms-1.0.jar:groupId是org.ibm.jms;artifactId是com.ibm.mqjms;version是1.0假设以上jar是可用的maven依赖的话,那在dependency依赖里的添加项为:org.ibm.jmscom.ibm.mqjms1.0org.ibm.jmscom.ibm.mq1.0下面的问题就是如何让Maven能找到这个虚拟Maven库。在pom.xml里,我们使用repositories声明可能查找的、多个其他的Maven的库,例如:falsealwayswarntrueneverfailcodehausSnapshotsCodehausSnapshotslib。它是一个release库而不是snapshot库。区别方式一:会直接引用指定路径的lib,而不会把它加到本地的Maven库里去,所以它只在当前project使用,但工程可以方便的共享,且不使用额外的空间方式二:引用的jars会首先被安装到本地的maven库里,然后再通过引用从本地的Maven库里加载,好处是一旦安装,在其他的project也可以引用,但是需要首先在本地安装,当前工程是便携的,但是直接引用而未如上声明的工程可能不是便携的。
maven项目的pom.xml中的包配置节点dependency求解答下
如果你的是web项目,你可以把jar包放到WEB-INF/lib下,然后这样配置
dependency
????????????groupIdjavabuilder/groupId
????????????artifactIdjavabuilder/artifactId
????????????version1.0/version
????????????scopesystem/scope
????????????systemPath${project.basedir}/src/main/webapp/WEB-INF/lib/javabuilder.jar/systemPath
/dependency
pom.xml文件中的Scope标签
我们在Maven项目,pom.xml文件中经常会碰到scope这个标签,有些同学搞不清楚这个scope对依赖的jar包有什么用。
在回答这个问题之前,我先简单的阐述一下java程序运行的阶段:
源码 = 编译 = 测试 = 运行 = 打包 = 部署
上述程序中同学们应该都可以看的懂,编写一个servlet 打印 hello world。
1.IDE在编译阶段按照pom.xml中的依赖关系会去查找log4j servlet的二方包,如果找不到就会出现错误
2.在测试某个函数会调用junit 二方包
3.运行阶段
4.打包的时候,pom.xml会告诉maven,哪些jar不需要打进去
所以它的pom.xml应该是这样的
总结:我们平常最大的scope疑问在provided 和 runtime之间。记住一个原则就行,如果容器有的jar,在项目pom.xml中就使用provided; 如果需要动态加载的jar就使用runtime 。默认scope是compile