• 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编译打包可以支持三种模式,分别如下:

    1. no-dependencies: 这种模式下target下面不会出现任何依赖的包,必须手动指定-classpath设置所在环境的依赖包路径;
    2. with-dependencies: 这种模式会把所有外部依赖的包都打进一个jar包,只需要把jar包发布到线上即可运行;
    3. copy-dependencies: 这种模式会把外部依赖的jar包都独立生成到target/下面,运行时候手动指定-classpath;

    from: http://www.firefoxbug.com/index.php/archives/2816/

  • 相关阅读:
    6、UITableView表的分割线左对齐
    5、清理mac缓存和关闭后台运行程序
    1、iOS9 HTTP 不能正常使用的解决办法
    在ios下提示“@synthesize of ‘weak’ property is only allowed in ARC or GC mode”
    java中的String类
    java思考题
    java思考
    java动手动脑思考
    大道至简第二章读后感
    JAVA训练参数求和
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/6995525.html
Copyright © 2020-2023  润新知