• 1. 青い夜の記憶 - 须藤ひとみ
  • 2. 念夏 - 马天宇
  • 3. 偏爱 - 张芸京
  • 4. エンド・タイトル-东京爱情故事
  • 5. 夜色 - 玉置浩二
  • 6. オセンチな歩美 - 大野克夫
  • 7. The_Godfather_Waltz/Speak_Softly_Medley - Jack_Jezzro
  • 8. 猫になりたい - スピッツ
  • 9. Love_Theme_from_Cinema_Paradiso - Jeff_Steinberg
  • 10. 時には昔の話を - 加藤登紀子
person

安装

基于项目对象模型(POM)的概念。

Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。

Maven项目的结构和内容在一个XML文件中声明,pom.xml 项目对象模型(POM),这是整个Maven系统的基本单元。

maven有三个仓库:

  1. 本地仓库。

用户目录下的.m2目录。

  1. 中央仓库。

Maven 中央存储库 – http://repo1.maven.org/maven2/

  1. 远程仓库。

有些包可能在中央仓库中找不到,所以可能需要在Java.net或JBoss的储存库远程仓库中能找到。

pom.xml中添加远程仓库:

<repositories>
       <repository>
         <id>java.net</id>
         <url>https://maven.java.net/content/repositories/public/</url>
       </repository>
    </repositories>
</project>

<project ...>
    <repositories>
      <repository>
    <id>JBoss repository</id>
    <url>http://repository.jboss.org/nexus/content/groups/public/</url>
      </repository>
    </repositories>
</project>

Mint:

sudo apt-get install maven

Windows:

下载binary文件:下载

把maven项目的bin目录配置到path中。

mvn -v

查看maven版本信息。

引入

maven项目标准目录为

project_name

----pom.xml

----src

--------main

------------java

----------------com

--------------------hello

------------------------Hello.java

--------test

------------java

----------------com

--------------------hello

------------------------HelloTest.java

----resource


HelloWorld.java

package com.hello;

public class HelloWorld {
    public String sayHello(){
        System.out.println("sayHello Hello !");

        return "Hello !";
    }
}

HelloTest.java

package com.hello;

import org.junit.*;
import org.junit.Assert.*;


public class HelloTest {
    @Test
    public void testHello(){
        Assert.assertEquals("Hello !", new HelloWorld().sayHello());
        System.out.println("hello");
    }
}

建立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/xsd/maven-4.0.0.xsd">
    <!--maven 版本-->
    <modelVersion>4.0.0</modelVersion>

    <!--一般为包名-->
    <groupId>com.hello</groupId>
    <!--一般为项目名-->
    <artifactId>maven_hello</artifactId>
    <!--项目版本-->
    <version>0.0.1SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>
</project>

在项目的根目录运行:

mvn compile

进行编译操作。这步将会在项目根目录下生成一个target目录,存放编译的class字节码等文件。然后

mvn test

运行测试代码。

结果:

sayHello Hello !
hello

接着试试:

mvn package

将会在target目录下生产jar包文件。

如果是打包war,自动下载的可能无法下载,可能需要加入maven插件确定版本:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
</plugin>
mvn clean

删除maven生产的目标文件。

接着运行:

mvn install

把当前项目jar安装到本地的仓库中。这样我们的其他项目就可以引用我们的这个项目。

然后运行:

mvn help:effective-settings

可以找出我们本地maven项目的储存路径。

我们按照刚才的方式再建立一个新的项目。

在新建的项目中引入我们的第一个项目:

<dependency>
            <groupId>com.hello</groupId>
            <artifactId>maven_hello</artifactId>
            <version>0.0.1SNAPSHOT</version>
 </dependency>

然后就可以在这个项目中使用我们的第一个项目的代码:

package com.hello2;
//导入
import com.hello.HelloWorld;


public class Speck {
    public String sayHi(){
        return new HelloWorld().sayHello();
    }
}

创建项目

mvn archetype:generate

根据提示输入groupId等信息。

或者在后面输入-指定=指定内容 的形式指定。

  • 从Maven模板创建Web项目
mvn archetype:generate -DgroupId=com.yiibai -DartifactId=CounterWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

修改为国内镜像

windows修改maven安装目录下的conf/settings.xml

Linux在/etc/maven/settings.xml

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

项目单独配置镜像仓库

<repositories>
  <repository>
    <id>ali-maven</id>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>true</enabled>
      <updatePolicy>always</updatePolicy>
      <checksumPolicy>fail</checksumPolicy>
    </snapshots>
  </repository>

  <repository>
    <id>central</id>
    <name>Maven Repository Switchboard</name>
    <layout>default</layout>
    <url>http://repo1.maven.org/maven2</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

修改本地仓库目录

修改settings.xml

<localRepository>/home/java/repo</localRepository>

手动jar包到本地仓库

打包或下载jar包后:

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar

外部依赖

在src目录下建立lib放入maven仓库无法下载的jar包,然后:

<dependency>
         <groupId>ldapjdk</groupId>
         <artifactId>ldapjdk</artifactId>
         <scope>system</scope>
         <version>1.0</version>
         <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
      </dependency>
   </dependencies>

依赖范围

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>demo_group</groupId>
          <artifactId>demo_artifat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

<scope>test</scope>指定了在测试阶段引用。即只在测试的classpath中存在。

这样的范围(classpath):

  • 编译
  • 测试
  • 运行
<exclusions>
    <exclusion>
        <groupId>demo_group</groupId>
        <artifactId>demo_artifat</artifactId>
    </exclusion>
</exclusions>

防止依赖传递。

依赖冲突

  1. 路径短的优先。
  2. 路径长度相同,先声明的优先。

maven插件

Maven 插件通常用于:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 进行代码单元测试
  • 创建项目文档
  • 创建项目报告

一个插件通常提供了一组目标,可使用以下语法来执行:

mvn [plugin-name]:[goal-name]

例如,一个 Java 项目可以使用 Maven 编译器插件来编译目标,通过运行以下命令编译

mvn compiler:compile
<properties>
        <jdk.version>1.7</jdk.version>
        <spring.version>4.1.1.RELEASE</spring.version>
        <jstl.version>1.2</jstl.version>
        <junit.version>4.11</junit.version>
        <logback.version>1.0.13</logback.version>
        <jcl-over-slf4j.version>1.7.5</jcl-over-slf4j.version>
</properties>

......

<build>
        <finalName>CounterWebApp</finalName>

        <plugins>
            <!-- Eclipse project -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                    <!-- Always download and attach dependencies source code -->
                <downloadSources>true</downloadSources>
                <downloadJavadocs>false</downloadJavadocs>
                <!-- Avoid type mvn eclipse:eclipse -Dwtpversion=2.0 -->
                <wtpversion>2.0</wtpversion>
            </configuration>
          </plugin>

          <!-- Set JDK Compiler Level -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
            </configuration>
          </plugin>

          <!-- For Maven Tomcat Plugin -->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <path>/CounterWebApp</path>
            </configuration>
          </plugin>
        </plugins>
    </build>

POM

所有的POM继承自父类(尽管明确界定)。这个基础的 POM 被称为超级 POM,并包含继承默认值。

Maven使用有效的POM(超级POM加项目配置的配置)执行有关目标。

它可以帮助开发人员指定最低配置的详细信息写在 pom.xml 中。

虽然配置可以很容易被覆盖。 一个简单的方法来看看超级POM的默认配置,通过运行下面的命令:

mvn help:effective-pom

执行之后,可以看到默认的项目源文件夹结构,输出目录,插件,资料库,报表目录,Maven将使用它们来执行预期的目标。

过滤文件夹信息:

mvn help:effective-pom |grep Dir

常用坐标

jsp

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

新评论