Maven整理笔记のMaven使用实践

  我们通过实践来补充Maven构建的生命周期。

  第一步:配置POM

  接着上一篇Maven使用,我们先创建一个名为helloworld的文件夹,在helloworld目录下创建pom.xml文件,pom.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                                    http://maven.apache.org/maven-4_0_0.xsd">
                                    <modelVersion>4.0.0</modelVersion>
                                    <groupId>com.j1.hhl</groupId>
                                    <artifactId>helloworld</artifactId>
                                    <version>0.0.1-SNAPSHOT</version>
                                    <name>MAVEN HELLO WORLD PROJECT</name>
   </project>

  第二步:编写Maven主代码

  在helloworld目录下,创建src/main/java/com/j1/hhl/helloworld/目录,在该目录下,创建HelloWorld.java,并编写如下代码:

package com.j1.hhl.helloworld;
public class HelloWorld{
          public String sayHello(){
                    return "Hello Maven";
          }
          public static void main(String [] args){
                    System.out.println(new HelloWorld().sayHello());
          }
}

  代码编写完毕后,使用Maven进行编译,在项目根目录下运行mvn clean compile会得到如图所示输出:

  

Clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码,从输出中看到Maven首先执行了clean:clean任务,删除target/目录。默认情况下,Maven构建的所有输出都在target/目录中;接着执行resources:resources任务(未定义项目资源,暂且略过);最后执行compile:compile任务,将项目主代码编译至target/classer目录中,我们可以在target\classes\com\j1\hhl\helloworld中看到Helloworld编译文件。上面提到的clean:clean、clean:clean、compile:compile对应了一些Maven插件及插件目标。

  第三步:编写Maven测试代码

在helloworld目录下,创建src/test/java/com/j1/hhl/helloworld/目录,在该目录下,创建HelloWorldTest.java。代码如下:

package com.j1.hhl.helloworld;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class HelloWorldTest{
     @Test
     public void testSayHello(){
              HelloWorld helloWorld = new HelloWorld();
              String result = helloWorld.sayHello();
              assertEquals("Hello Maven",result);
     }
}

  在代码中我们看到,在测试类中用到的是junit单元测试,所以在进行测试这一步骤前,我们需要引入junit第三方java 类库。在pom配置如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.j1.hhl</groupId>
  <artifactId>helloworld</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Maven Hello World Project</name>
  <dependencies>
       <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
       </dependency>
  </dependencies>
</project>

配置完成之后,在项目根目录下运行mvn clean test命令。结果如图所示:

   

  同样也经过clean:clean\resources:resources\compile:compile\test:test这几个步骤,测试代码在编译之后会在target\test-classes生成二进制文件,测试运行完成之后,会在surefire-reports下生成测试报告。

  第四步:打包

编译测试完之后,就是打包,在项目根目录下运行mvn clean package命令,结果如图所示:

  

  同样也经过clean:clean\resources:resources\compile:compile\test:test\jar:jar这几个步骤。

  运行完之后,我们可以在target/输出目录中,看到一个依据pom.xml文件中配置artifactId-version规则的jar包:helloworld-0.0.1-SNAPSHOT.jar。同时在target中多出一个maven-archive文件夹,文件夹下放置的是pom属性文件。

  第五步:Maven安装

至此我们的构建生命周期已经基本结束,如果有需要的话,我们可以复制这个jar文件到其他项目的Classpath中从而使用HelloWorld类。但是,如何才能让其他的Maven项目直接引用这个jar包呢?还需要一个安装步骤,即运行命令mvn clean install,结果如图所示:

  

      同样也经过clean:clean\resources:resources\compile:compile\test:test\jar:jar\install:install这几个步骤。

  运行成功之后,我们可以在Maven本地仓库中找到helloworld-0.0.1-SNAPSHOT.jar和helloworld-0.0.1-SNAPSHOT.pom,我们可以复制pom文件的配置到自身Maven项目pom中,如此即可调用HelloWorld类。

  当所有完成之后, 我们可以运行helloworld-0.0.1-SNAPSHOT.jar这个文件,具体操作是运行java –jar target\helloworld-0.0.1-SNAPSHOT.jar 结果如图所示:

  包中没有主清单属性,为什么?

  原因:我们可以利用反编译软件打开刚刚生成的jar包,继续打开包中的META-INF下的MANIFEST.MF文件,发现没有Main-Class: com.j1.hhl.helloworld.HelloWorld这一行。为什么没有这一行:那是因为HelloWorld存在main方法。在不删除main方法的前提下,解决办法如下:

  在POM中修改配置如下:

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.j1.hhl</groupId>
    <artifactId>helloworld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Hello World Project</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>
                                shade
                            </goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>
                                        com.j1.hhl.helloworld.HelloWorld
                                    </mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

  重新运行mvn clean install,此时我们会发现在输出目录target中会多出一个名为original-helloworld-0.0.1-SNAPSHOT.jar文件,从命名可以看出这是一个源文件,相对于helloworld-0.0.1-SNAPSHOT.jar的源文件,可运行的自然是helloworld-0.0.1-SNAPSHOT.jar,我们可以运行一下:

  

时间: 2024-10-13 22:50:08

Maven整理笔记のMaven使用实践的相关文章

Maven整理笔记のMaven仓库

Maven坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式:而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件.  Maven仓库 在Maven的世界中,任何一个依赖.插件或者项目构建的输出,都可以称为一个构件.如项目依赖log4j-1.2.15.jar是一个构件,插件maven-compiler-plugin-2.0.3.jar是一个构件,我们自己的Maven项目构建完成后的输出.jar/war文件也是一个构件.任何一个构件都有一组坐标唯一标识.在我们项目开发中,往往可能

Maven整理笔记のMaven使用

POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml.POM(Project Object Model项目对象模型),定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. 我们先来建立一个经典的Hello world Maven项目. 先建立一个helloworld文件夹,在文件夹中新建pom.xml文件,在文件中编写如下代码: <?xml version="1.0" encoding="UTF-8&qu

Maven整理笔记の安装及配置

  第一部分:在Windows上安装Maven    检查JDK的安装 在安装Maven之前,首先确认你已经正确安装了JDK.Maven可以运行在JDK1.4及以上版本.先打开Windows命令,运行如下命令检查JDK的安装: 上述命令首先检查环境变量JAVA_HOME是否指向了正确的JDK安装目录,接着尝试运行java命令,检查JDK的版本. 下载Maven 请访问Maven的下载页面:http://maven.apache.org/download.html,其中包含针对各种平台的不同版本的

Maven整理笔记の初步窥探

第一部分:引言 Maven是一款跨平台的项目管理工具,作为Apache组织的一个开源项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理. 项目构建:编译.运行单元测试.生成文档.打包和部署等一些繁琐且毫不起眼的工作就是构建.而Maven就是一款优秀的构建工具,它不仅可以标准化构建步骤(在Maven之前,十个项目,可能会有十种构建方式:有了Maven之后,所有的构建命令都变得简单一致),还可以抽象项目构建的生命周期,实现整个项目构建的自动化操作. 项目依赖:Maven提供了一个非常

Maven整理笔记の生命周期和插件

项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件机制是完全依赖Maven的生命周期的. 三套生命周期 Maven的生命周期并不是一个整体,Maven拥有三套独立的生命周期,它们分别是clean\default\site.Clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site的生命周期的目的是建立项目站点. 每个生命

maven学习笔记--maven项目创建

使用Maven命令和Eclipse的Maven插件,创建Maven项目 (1)maven命令生成项目         新建一个文件目录,dos进入该目录并执行下面命令: mvn archetype:create -DgroupId=com.learn -DartifactId=LearnNew -DarchetypeArtifactId=maven-archetype-webapp (2)使用Eclipse生成项目          Elipse中发布一个Maven项目到Tomcat:http:

Maven学习笔记

Maven学习笔记 Maven是项目管理工具 1. 安装Maven 在apache官网(http://maven.apache.org/download.cgi) 下载apache-maven-3.3.3-bin.zip和apache-maven-3.3.3-src.zip:解压,把bin的位置设在环境变量里, 新建环境变量名:MAVEN_HOME 值:C:\Users\pengtao.yue\apache-maven-3.3.3\bin 在path中加入:%MAVEN_HOME% 在DOS中输

Maven学习笔记之——坐标和依赖(下)

Maven学习笔记之--坐标和依赖(下) 1.    最佳实践 归纳Maven依赖使用的常用技巧.方便用来避免和处理很多常见问题. 1.1.     排除依赖 传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理.但是有些时候这种特性也会带来问题.例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目.这时候需要排除掉该SNAPSH

学习笔记——Maven实战(九)打包的技巧

“打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“,具体说就是将项目中的各种文件,比如源代码.编译生成的字节码.配置文件.文档,按照规范的格式生成归档,最常见的当然就是JAR包和WAR包了,复杂点的例子是Maven官方下载页面的分发包,它有自定义的格式,方便用户直接解压后就在命令行使用.作为一款”打包工具“,Maven自然有义务帮助用户创建各种各样的包,规范的JAR包和WAR包自然不再话下,略微复杂的自定义打包格式也必须支持,本文就介绍一些常用的打包案例以及相关的实现方式,除了前