java学习之maven

 maven是项目构建工具,能把项目抽象成POM(Project Object Model)

Maven使用POM对项目进行构建、打包、文档化等操作

解决了项目需要类库的依赖管理,简化了项目开发环境搭建的过程

maven实现了:

  是构建项目变得容易;

  统一了构建项目的方式,通过pom.xml描述项目;

  提出了一套开发项目的最佳实践,源代码在src/main/java中,配置文件在src/main/resources中,测试代码在src/test/java中;

  包含不同环境项目构建方式;

  解决了类库依赖的问题,自动下载依赖包,协助管理jar包之间的冲突

1.maven的核心是pom.xml,用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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
groupId项目所属的组
artifactId 项目唯一标识
version项目的版本号
packaging项目的类型,常用的有jar和war
modelVersion maven的版本
dependencies依赖
build插件

2.下载

https://maven.apache.org/

3.安装

直接解压,如E:\baby\software\java\apache-maven-3.5.3

设置环境变量

MAVEN_HOME = E:\baby\software\java\apache-maven-3.5.3
path = %MAVEN_HOME%\bin;

安装Maven是否安装成功

mvn -version

4.设置maven

中心仓库位于国外,下载速度会很慢

安装目录下,conf/settings.xml

添加仓库镜像

<mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

 

5.常用的命令

新建一个maven目录

(1)进入此目录,创建一个maven工程

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes  -DgroupId=com.mycompany.app -DartifactId=my-app

成功创建项目工程my-app

目录结构

maven项目采用“约定优于配置”的原则

  src/main/java约定用于存放源代码

  src/main/test用于存放单元测试代码

  src/target用于存放编译、打包后的输出文件

pom.xml

<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-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompant.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 (2)编译maven工程

mvn  compile

会自动在target目录中生成class文件

打包编译时后台一直输出警告信息

在pom.xml增加

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

(3)删除target目录

mvn  clean

(4)测试

mvn clean test

/src/test/java/com/mycompant/app/AppTest.java里的junit的测试用例,把testApp()方法中的assertTrue( true );改成assertTrue( false );

mvn clean test

 

(5)运行

A.不需要传递参数的

mvn exec:java -Dexec.mainClass="com.mycompant.app.App"

B.需要传递参数的

mvn exec:java -Dexec.mainClass="com.mycompant.app.App" -Dexec.args="arg0 arg1 arg2" 

C.修改pom.xml

 在</project>前增加下面代码

<build>
      <finalName>${project.artifactId}</finalName>
      <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                     <execution>
                         <goals>
                             <goal>exec</goal>
                         </goals>
                     </execution>
            </executions>
            <configuration>
                     <executable>java</executable>          
                     <arguments>                       
                         <argument>-classpath</argument>
                         <classpath>
                         </classpath>
                         <argument>com.mycompant.app.App</argument>
                     </arguments>
            </configuration>
          </plugin>
      </plugins>
  </build>

直接

mvn exec:exec

(6)打包

mvn  package

在target目录生成jar或war

直接到target目录下去执行java -jar my-app.jar命令运行jar包时出现了“my-app.jar没有主清单属性”的错误提示

加上入口类的配置,在pom.xml中的</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.mycompant.app.App</mainClass>
                            </transformer>
                        </transformers>
                </configuration>
              </execution>
            </executions>
       </plugin>

说明:

  配置完成后,执行mvn package即可打包

  在target目录下会生成两个jar包,注意不是my-app.jar文件,而是另外一个

  (my-app.jar 是因为<build>中包含 <finalName>${project.artifactId}</finalName>,否则名为original-xxx.jar)

  生成的jar文件包含了所有依赖,所以可以直接运行

重新打包

mvn clean package

重新进入target

此时会有两个jar文件

java -jar my-app-1.0-SNAPSHOT.jar

如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:

 

完整的pom.xml

<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-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompant.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
      <finalName>${project.artifactId}</finalName>
      <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                     <execution>
                         <goals>
                             <goal>exec</goal>
                         </goals>
                     </execution>
            </executions>
            <configuration>
                     <executable>java</executable>          
                     <arguments>                       
                         <argument>-classpath</argument>
                         <classpath>
                         </classpath>
                         <argument>com.mycompant.app.App</argument>
                     </arguments>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.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.mycompant.app.App</mainClass>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                        </transformers>
                </configuration>
              </execution>
            </executions>
          </plugin>
      </plugins>
  </build>
</project>

直接到target运行

java -jar my-app.jar

输出Hello World!

6.使用IDE设置Maven

Eclipse  windows--》preference

 

add,Installation home 输入maven的安装目录

 

添加后勾选使用新的maven

创建web的maven项目 File -> New -> Maven Project -> Next

Group id和Artifact id

finish

说明:

  项目可能会出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 的错误

  点击项目右键>>Build Path>>Configure Build Path>>Libraries>>Add Library>>Server Runtime>>配置好的tomcat服务>>finish>>apply and Close

tomcat server start

浏览器中 http://localhost:8080/my-app/

输出

Hello World!

posted @ 2018-03-14 13:42  慕尘  阅读(330)  评论(0编辑  收藏  举报