maven

如果我们的项目依赖第三方的jar包:

  • Commons Logging发布的jar包在那里下载?
  • 使用Log4j需要哪些jar包
  • 其他依赖:junit,Javamail,MySQL驱动...



    方法1:搜索引擎——手动下载——解压——放入classpath:过程非常繁琐

    方法2:maven解决了依赖管理的问题

    Hello项目-->依赖abc -> abc又依赖于xyz

    当我们生命了abc的依赖时,maven自动把adb依赖的xyz jar包也加入到项目依赖中,不需要我们自己去研究abc是否需要依赖xyz。

    所以maven的第一个作用就是解决了依赖管理,我们声明了自己的项目,需要abc,maven就会自动导入abc的jar,再判断出abc又需要依赖xyz,又会自动导入xyz的jar包,这样最终我们的项目会依赖abc和xyz这2个jar包

一个复杂的依赖示例

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <version>1.4.2Release</version>
  5. </denpendency>

当我声明1个spring-boot-start-web依赖时,maven会自动解析并判断出需要大概20-30个依赖。如果手动去管理这些依赖是非常费时费力的,而且出错的概率很大。

maven的依赖关系有以下几种:

scope 说明 示例
compile 编译时需要用到该jar包(默认) commons-logging
test 编译Test时需要用到该jar包 junit
runntime 编译时不需要,但运行时需要 log4j
provided 编译时需要用到,但运行时有JDK或某个服务器提供 servlet-api

maven从何处下载所需的依赖:

  • maven维护了一个中央仓库
  • 第三方库将自身上传值中央仓库
  • maven从中央仓库把所需依赖下载到本地
  • maven会自动缓存已下载过的jar包(~/.m2/repository)

代码示例

新建一个maven工程,根据groupId+artifactId新建package,并新建App.java

  1. import org.apache.commons.logging.Log;
  2. import org.apache.commons.logging.LogFactory;
  3. public class App {
  4. public static void main(String[] args){
  5. Log log = LogFactory.getLog(App.class);
  6. log.info("Hello,world!");
  7. }
  8. }

log4j2.xml 来源:https://www.cnblogs.com/new-life/p/9246143.html

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  3. <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
  4. <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
  5. <configuration status="WARN" monitorInterval="30">
  6. <!--先定义所有的appender-->
  7. <appenders>
  8. <!--这个输出控制台的配置-->
  9. <console name="Console" target="SYSTEM_OUT">
  10. <!--输出日志的格式-->
  11. <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  12. </console>
  13. <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
  14. <File name="log" fileName="log/test.log" append="false">
  15. <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
  16. </File>
  17. <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
  18. <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
  19. filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
  20. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  21. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  22. <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  23. <Policies>
  24. <TimeBasedTriggeringPolicy/>
  25. <SizeBasedTriggeringPolicy size="100 MB"/>
  26. </Policies>
  27. </RollingFile>
  28. <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
  29. filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
  30. <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
  31. <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  32. <Policies>
  33. <TimeBasedTriggeringPolicy/>
  34. <SizeBasedTriggeringPolicy size="100 MB"/>
  35. </Policies>
  36. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
  37. <DefaultRolloverStrategy max="20"/>
  38. </RollingFile>
  39. <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
  40. filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
  41. <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
  42. <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  43. <Policies>
  44. <TimeBasedTriggeringPolicy/>
  45. <SizeBasedTriggeringPolicy size="100 MB"/>
  46. </Policies>
  47. </RollingFile>
  48. </appenders>
  49. <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
  50. <loggers>
  51. <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
  52. <logger name="org.springframework" level="INFO"></logger>
  53. <logger name="org.mybatis" level="INFO"></logger>
  54. <root level="all">
  55. <appender-ref ref="Console"/>
  56. <appender-ref ref="RollingFileInfo"/>
  57. <appender-ref ref="RollingFileWarn"/>
  58. <appender-ref ref="RollingFileError"/>
  59. </root>
  60. </loggers>
  61. </configuration>

pom.xm

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.csjsample</groupId>
  7. <artifactId>hellodep</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <java.verison>1.8</java.verison>
  13. <maven.compiler.source>1.8</maven.compiler.source>
  14. <maven.compiler.target>1.8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>commons-logging</groupId>
  19. <artifactId>commons-logging</artifactId>
  20. <version>1.2</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.apache.logging.log4j</groupId>
  24. <artifactId>log4j-jcl</artifactId>
  25. <version>2.10.0</version>
  26. <scope>runtime</scope>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.apache.logging.log4j</groupId>
  30. <artifactId>log4j-core</artifactId>
  31. <version>2.10.0</version>
  32. <scope>runtime</scope>
  33. </dependency>
  34. <dependency>
  35. <groupId>junit</groupId>
  36. <artifactId>junit</artifactId>
  37. <version>4.12</version>
  38. <scope>test</scope>
  39. </dependency>
  40. </dependencies>
  41. </project>


运行App.java

修改pom.xml
```#xml

4.0.0

  1. <groupId>com.csjsample</groupId>
  2. <artifactId>hellodep</artifactId>
  3. <version>1.0-SNAPSHOT</version>
  4. <packaging>jar</packaging>
  5. <properties>
  6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  7. <java.verison>1.8</java.verison>
  8. <maven.compiler.source>1.8</maven.compiler.source>
  9. <maven.compiler.target>1.8</maven.compiler.target>
  10. </properties>
  11. <dependencies>
  12. <dependency>
  13. <groupId>commons-logging</groupId>
  14. <artifactId>commons-logging</artifactId>
  15. <version>1.2</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>junit</groupId>
  19. <artifactId>junit</artifactId>
  20. <version>4.12</version>
  21. <scope>test</scope>
  22. </dependency>
  23. </dependencies>

```

运行App.java

maven镜像

访问maven的中央仓库比较慢,可以访问maven的镜像仓库



在~/.m2/目录下新建settign.xml文件,将以下内容复制进去

  1. <settings>
  2. <mirrors>
  3. <mirror>
  4. <id>aliyun</id>
  5. <name>aliyun</name>
  6. <mirrorOf>central</mirrorOf>
  7. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  8. </mirror>
  9. </mirrors>
  10. </settings>

总结

  • maven通过解析依赖关系确定项目所需的jar包
  • 常用的4中scope:compile(默认)、test、runtime、provided
  • maven从中央仓库下载所需jar包并缓存在本地
  • 可以通过镜像加速下载

廖雪峰Java12maven基础-1maven入门-2依赖管理的更多相关文章

  1. 廖雪峰Java12maven基础-1maven入门-1maven介绍

    1.Java项目: * 1.1.首先确定引入哪些依赖包,如commons-logging, log4j, selenium * 1.2.确定项目的目录结构 * 1.3.配置环境:如JDK的版本号 * ...

  2. 廖雪峰Java12maven基础-1maven入门-3构建流程

    maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...

  3. 廖雪峰Java12maven基础-2maven进阶-2模块管理

    1. 把大项目拆分为模块是降低软件复杂度的有效方法 在Java项目中,我们通常会会把一个项目分拆为模块,这是为了降低软件复杂度. 例如:我们可以把一个大的项目氛围module-a, module-b, ...

  4. 廖雪峰Java12maven基础-2maven进阶-1使用插件

    1.maven的Lifecycle,Phase和Goal: 使用maven构建项目就是执行Lifecycle 执行Lifecycle就是按顺序执行一系列Phase 每执行一个Phase,都会执行该Ph ...

  5. git入门笔记汇总——(廖雪峰博客git入门)

    本文内容是对廖雪峰老师Git教程做的笔记,外加一些自己的学习心得,还抱着学以致用的心态来实践一番 如有显示错误 请移步本人github:git教程小结 Git学习笔记 Git简介 安装Git 创建版本 ...

  6. 廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete

    1. INSERT用于向数据库的表中插入1条记录 insert into 表名 (字段1,字段2,...) values (数据1,数据2,数据3...) 示例 -- 如果表存在,就删除 drop t ...

  7. 廖雪峰Java15JDBC编程-2SQL入门-1SQL介绍

    1.SQL:结构化查询语言 Structured Query Language 针对关系数据库设计 各种数据库基本一致 允许用户通过SQL查询数据而不关心数据库底层存储结构 1.1 SQL使用: 可以 ...

  8. 廖雪峰Git入门教程

    廖雪峰Git入门教程  2018-05-24 23:05:11     0     0     0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...

  9. git入门(廖雪峰老师)

    根据廖雪峰老师的git教程进行学习总结: 1.之前上班用的都是svn进行管理,那么svn和git有什么区别呢? svn是集中式的版本控制系统,而git是分布式版本控制系统,那么集中式和分布式版本控制系 ...

随机推荐

  1. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  2. USACO 2007 “March Gold” Ranking the Cows

    题目链接:https://www.luogu.org/problemnew/show/P2881 题目链接:https://vjudge.net/problem/POJ-3275 题目大意 给定标号为 ...

  3. JS-copy到剪贴板

    因为 clipboard.js 兼容性受限

  4. Ubuntu环境下Postgres源码文件编译安装步骤

    step1:官网下载postgres源码 URL:https://www.postgresql.org/ftp/source/ step2:解压源码文件 tar -zxvf postgresql-12 ...

  5. java内存模型和垃圾回收

    摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...

  6. digitalpersona 开发

    一 下载 sdk : https://codeload.github.com/iamonuwa/Digital-Persona-SDK/zip/master 二 解压后,安装SDK 三 找到安装目录( ...

  7. css悬浮在页面顶端

    .header{ position:fixed; margin-top:; width:%; z-index:; } .body{ position:relative; padding-top:119 ...

  8. Java 基础 - instanceof关键字

    instanceof 父类子类 结论: 子类 instanceof 父类 == true 父类 instanceof 子类 == false public class Test { public st ...

  9. 校园商铺-4店铺注册功能模块-4Dto之ShopExecution的实现

    1. DTO:添加店铺的返回类型 问题:为什么不直接用实体类Shop呢? 原因:在操作Shop的时候,必然会有一个状态.添加店铺,添加成功,还是添加失败? 如果添加失败,失败是一个什么状态,这些都是要 ...

  10. SSE:服务器推送事件

    SSE:Server-Sent Event,服务器推送事件 常规的Http协议是一个请求对应一个响应的这种方式的 但对于某些实时性要求比较高的需求,HTML5中新增了SSE,可以很方便的实现局部数据的 ...