maven学习二(dependencies)
在前面一篇文章maven学习一(HelloWorld工程)已经对maven有了基本介绍,本文开始介绍maven依赖,通过如何如何增加log4j来学习maven的dependencies
no-dependencies模式
首先介绍maven不加如何配置情况下default的模式。在前面HelloWorld的App.java里添加log4j:
$ vim src/main/java/com/firefoxbug/www/App.java
package com.firefoxbug.www;
import org.apache.log4j.Logger;
public class App
{
public static void main( String[] args )
{
Logger logger = Logger.getLogger(App.class);
logger.info( "Hello World!" );
}
}
# 增加log4j配置
$ mkdir src/main/resources/ && vim log4j.properties
# Root logger option
log4j.rootLogger=DEBUG, stdout, file
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/tmp/logcount.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
$ mvn package # 这里必然是会报错的,因为找不到Logger库
接下来在pom.xml里描述对log4j的依赖:
$ vim pom.xml
<dependencies>
....
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
...
</dependencies>
$ mvn package -Dmaven.test.skip=true # 再次编译能过
$ mvn dependency:tree # 查看所有依赖
...
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] \- log4j:log4j:jar:1.2.17:compile
...
但是运行的时候报错,原因还是找不到log4j的库,原因是因为生成的jar包里不包含log4j相关的库,而且$CLASSPATH里也没有log4j的lib。
$java -cp target/HelloWorld-1.0-SNAPSHOT.jar com.firefoxbug.www.App
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at com.firefoxbug.www.App.main(App.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
...
一种解法就是把log4j的包下载下来,然后运行时指定classpath
$ cd /tmp/
$ wget https://archive.apache.org/dist/logging/log4j/1.2.17/log4j-1.2.17.tar.gz
$ tar -zxvf log4j-1.2.17.tar.gz
$ java -cp "target/HelloWorld-1.0-SNAPSHOT.jar:/tmp/apache-log4j-1.2.17/log4j-1.2.17.jar:" com.firefoxbug.www.App
试想一下,运行时log4j是找到了,但是一旦jar包发布出去到线上,而线上机器并没有配置运行时的log4j呢?这时候maven就可以配置one-jar模式,把所有外部依赖jar包都打进一个包。
one-jar/jar-with-dependencies模式
修改工程下面的maven配置,配置成jar-with-dependencies模式。
$ vim ~/pom.xml
<project>
...
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
再次用maven编译,就会发现target下面多了一个HelloWorld-1.0-SNAPSHOT-jar-with-dependencies.jar,这个包里面就包含了外部依赖的class文件
$ mvn clean && mvn package
$ java -cp "target/HelloWorld-1.0-SNAPSHOT-jar-with-dependencies.jar" com.firefoxbug.www.App
2016-01-10 21:59:27 INFO App:10 - Hello World!
其实可以尝试吧*-jar-with-dependencies.jar解压出来就会发现里面已经包含了org/apache/log4j的所有class文件。
muti-jar/copy-dependencies模式
上面的one-jar模式会把所有的外部依赖都打包到一个jar包里,但是如果我不想把外部的dependencies打入我的jar包,而且又要能够解决所有运行时依赖。maven也提供了一种muti-jar/copy-dependencies模式。
$ vim pom.xml
<project>
...
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
再次用maven clean、package后,发现在target下面会独立出现HelloWorld-1.0-SNAPSHOT.jar和log4j-1.2.17.jar
$ mvn clean && mvn package
$ java -cp "target/HelloWorld-1.0-SNAPSHOT.jar:target/log4j-1.2.17.jar" com.firefoxbug.www.App
2016-01-10 22:25:26 INFO App:10 - Hello World!
总结
maven编译打包可以支持三种模式,分别如下:
- no-dependencies: 这种模式下target下面不会出现任何依赖的包,必须手动指定-classpath设置所在环境的依赖包路径;
- with-dependencies: 这种模式会把所有外部依赖的包都打进一个jar包,只需要把jar包发布到线上即可运行;
- copy-dependencies: 这种模式会把外部依赖的jar包都独立生成到target/下面,运行时候手动指定-classpath;
from: http://www.firefoxbug.com/index.php/archives/2816/
maven学习二(dependencies)的更多相关文章
- Maven学习 二 Maven环境搭建
第一步:下载Maven并解压 注意选择镜像地址,选择国内的会快点 解压目录 Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf: ...
- Maven学习二:使用Nexus搭建Maven私服及相关配置
处于安全等原因的考虑,一些企业内部网络是不允许访问外部网络的,但是项目内部搭建的项目又是Maven架构,这样就需要企业在内部网络中搭建自己的Maven仓库服务,再者一些大型企业或者内部模块化组件化划分 ...
- Maven学习 (二) Eclipse 上安装 Maven3插件
eclipse 安装插件的方式最常见的有两种: 1. 一种是在线安装,这貌似是用的最多的,就是:Help --> Install New Software,然后输入 HTTP 地址来安装,但 ...
- Maven学习(二)-----Maven启用代理访问
Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...
- (转)Maven学习总结(二)——Maven项目构建过程练习
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...
- Maven学习系列二(1-5)
Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...
- maven学习之二M2_HOME简介
在<maven学习之一>中介绍了M2_HOME指向了maven的安装目录,如下图: weiwan..................
- Maven学习日记(二)---MAVEN创建多模块的项目
手动构建多模块maven项目,这个simple-parent项目下有两个子模块,一个是jar包型的simple-weather和一个war型的simple-webapp1.创建一个父的simple-p ...
- Maven 学习笔记(二)
前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...
随机推荐
- 【gearman】学习笔记
学习资料:http://gearman.org/manual/ 1.Gearman是跨语言的,client和worker可以用不同的语言来实现 2.client与job server之间的交互称为ta ...
- Python中的各种转义符\n\r\t
转义符 描述 \ 续行符(在行尾时) \\ 反斜杠符号 ' 单引号 " 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \t 横 ...
- jmeter在返回的json串中提取需要的值
接口测试时我们需要对某条信息进行修改,如我们先创建了一篇文章,然后进行修改操作 我们就需要找到该文章的唯一标志,如id 示例:我们要将下图返回的json 中id进行提取 注:可输入$.加需要的key即 ...
- Android strings.xml中定义字符串显示空格
<string name="str">字 符 串</string> 其中 就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...
- IntelliJ IDEA快捷键:Ctrl+Alt+B
To navigate to the implementation(s) of an abstract method,position the caret at its usage or its na ...
- Spring MVC的前端控制器模式
前端控制器模式 spring mvc也是依赖servlet,所以spring mvc的请求处理是从一个servlet开始,这个servlet就是DispatcherServlet.前端控制器模式(Fr ...
- python全栈开发day45-DOM操作、对象、定时器
一.昨日内容回顾 1.内置对象 Array String Date Math 2.DOM事件三要素:事件源.事件.事件驱动程序 事件源,事件,事件驱动程序 3.获取事件源的三种方式 var oDiv ...
- 018 spark on yarn (Job history)的配置,主要是yarn处跳转到历史聚合页面
一:目标 1.目标 在yarn的8080页面可以跳转到spark的日志18080页面. 因为在运行spark之后,看对应的job的日志,这样直接连接,更合理直接. 2.总结 在后面可以看到,其实不需要 ...
- 缓存击穿、缓存失效及热点key的解决方案
分布式缓存是网站服务端经常用到的一种技术,在读多写少的业务场景中,通过使用缓存可以有效地支撑高并发的访问量,对后端的数据库等数据源做到很好地保护.现在市面上有很多分布式缓存,比如Redis.Memca ...
- Windows10 下安装scrapy 日志
Windows10 下安装scrapy 日志 1.下载python3.6 2.添加python.exe和pip.exe的路径到系统环境变量path中 如c:\python36_64 C:\Python ...