maven依赖关系中Scope的作用

最近在上课是老师讲了maven,当时不知道,是什么,只是在老师的演示下知道了他的一个作用就是当你在建立时间证明jar文件和POM的依赖关系时,Maven将自动将jar文件所需版本下载到本地存储库。这个特点可以让你更加轻松地构建项目。
而当我们需要某个jar包时就不需要在手动导入了只需要在pom.xml文件中添加上一些依赖项就行
如:<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

这是maven自带的junit测试包
但是我们如何知道groupId,artifactId和version呢? 比如我现在想引用log4j,这个几个值怎么填? 可以去http://mirrors.ibiblio.org/maven2/ 上去查找。比如log4j,我们就在上面这个地址加上log4j,也就是http://mirrors.ibiblio.org/maven2/junit/。进去后会有一个maven-metadata.xml,打开就可以知道这些值了然后添加这个dependency了。
我在课下练习时 ,使用eclipse建立了一个maven项目,并在pom.xml上添加了Oracle数据库驱动和sql2o驱动包
在这我要说一下maven官方库并没有ojdbc6.jar
ojdbc6是我手动添加到maven本地仓库中的
具体过程如下:

  1. 在E盘新建oracle文件夹,将下载好的oracle6.jar放到oracle文件夹中
  2. 在cmd中运行一下:
    C:\Users\lgh>mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=E:/oralce/ojdbc6-11.1.0.7.0.jar
    这样你就可以在本地仓库中找到添加的ojdbc6.jar了

  3. 在pom.xml中添加依赖项:

 <dependency>
      <groupId>org.sql2o</groupId>
      <artifactId>sql2o</artifactId>
      <version>1.5.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
   <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.1.0.7.0</version>
   <scope>test</scope>

当写好测试代码运行是发现出现以下异常

Caused by: java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@localhost:1521:orcl
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at org.sql2o.GenericDatasource.getConnection(GenericDatasource.java:62)
    at org.sql2o.Connection.createConnection(Connection.java:288)
    ... 4 more

经过在百度上一番查找 ,最终发现出错的原因是:
test
这一行语句
原先是 test 改成 runtime 就可以用了
那么有什么作用呢?

在POM 4中,中还引入了,它主要管理依赖的部署。目前可以使用5个值:

  • compile,缺省值,适用于所有阶段,会随着项目一起发布。
  • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
  • runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  • test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
    依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。让我们详细看一下每一种范围:
    compile (编译范围)
    compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
    provided (已提供范围)
    provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
    runtime (运行时范围)
    runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC
    驱动实现。
    test (测试范围)
    test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
    system (系统范围)
    system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

你可能感兴趣的:(maven,库)