发表于: 2018-03-08 16:55:23

3 760


一、今天学习的内容总结


我将今天的学习内容和总结放在这里:

创建一个maven项目

这里推荐官方文档:maven官方文档

【注】此篇文章也是笔者学习笔记,如有错误,请见谅。

1.编写POM

POM(project Object Model)项目对象模型,它是一个XML文件,这个文件包含了maven创建项目所需要项目配置细节等信息, 比如:项目的基本信息,用于描述项目如何构建、声明项目依赖等等。。。他是Maven项目的核心

这个文件包含了一些默认值,像下面的编写dom没有直接给出,但还是会默认给出,比如:项目所在的文件夹是,target;项目的源代码所在的文件夹是:src/main/java ,测试的代码所在文件夹是src/test/java等等。。。

在maven1中,POM叫做project.xml在maven2中改名成了pom.xml

1.创建工作区

mkdir workspace
cd workspace
mkdir hello-world
执行以上命令,创建两个文件夹

命令和插件都配置在了pom.xml!当执行命令或任务的时候,Maven首先在当前文件夹下寻找POM,它读找到了POM,它读取了POM!它得到了所需要的配置信息!它执行了我们给他们的命令!

上面提到了pom.xml里面存在着默认的配置信息,为什么呢?难不成它直接存储在了硬件之上?肯定不是的,那么还应该有个文件,有着某些特殊的功能,,,这个就是Super POM!!!!

【知识点】Super POM

Super POM,顾名思义,就是超级POM(项目对象模型),和Java类似,所有的POM都继承至这个POM,它是Maven的默认POM,来吧,看看这个POM里面有什下面是2.1.x的maven 的 Super POM代码

    <project>
      <modelVersion>4.0.0</modelVersion>
      <name>Maven Default Project</name>
     
      <repositories>
        <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>
     
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <name>Maven Plugin Repository</name>
          <url>http://repo1.maven.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <releases>
            <updatePolicy>never</updatePolicy>
          </releases>
        </pluginRepository>
      </pluginRepositories>
     
      <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
        <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
       <pluginManagement>
           <plugins>
             <plugin>
               <artifactId>maven-antrun-plugin</artifactId>
               <version>1.3</version>
             </plugin>       
             <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
               <version>2.2-beta-2</version>
             </plugin>         
             <plugin>
               <artifactId>maven-clean-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>2.0.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-dependency-plugin</artifactId>
               <version>2.0</version>
             </plugin>
             <plugin>
               <artifactId>maven-deploy-plugin</artifactId>
               <version>2.4</version>
             </plugin>
             <plugin>
               <artifactId>maven-ear-plugin</artifactId>
               <version>2.3.1</version>
             </plugin>
             <plugin>
               <artifactId>maven-ejb-plugin</artifactId>
               <version>2.1</version>
             </plugin>
             <plugin>
               <artifactId>maven-install-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-jar-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>2.5</version>
             </plugin>
             <plugin>
               <artifactId>maven-plugin-plugin</artifactId>
               <version>2.4.3</version>
             </plugin>
             <plugin>
               <artifactId>maven-rar-plugin</artifactId>
               <version>2.2</version>
             </plugin>        
             <plugin>                
               <artifactId>maven-release-plugin</artifactId>
               <version>2.0-beta-8</version>
             </plugin>
             <plugin>                
               <artifactId>maven-resources-plugin</artifactId>
               <version>2.3</version>
             </plugin>
             <plugin>
               <artifactId>maven-site-plugin</artifactId>
               <version>2.0-beta-7</version>
             </plugin>
             <plugin>
               <artifactId>maven-source-plugin</artifactId>
               <version>2.0.4</version>
             </plugin>         
             <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.3</version>
             </plugin>
             <plugin>
               <artifactId>maven-war-plugin</artifactId>
               <version>2.1-alpha-2</version>
             </plugin>
           </plugins>
         </pluginManagement>
      </build>
     
      <reporting>
        <outputDirectory>${project.build.directory}/site</outputDirectory>
      </reporting>
      <profiles>
        <profile>
          <id>release-profile</id>
     
          <activation>
            <property>
              <name>performRelease</name>
              <value>true</value>
            </property>
          </activation>
     
          <build>
            <plugins>
              <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-sources</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-javadocs</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                  <updateReleaseInfo>true</updateReleaseInfo>
                </configuration>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
     
    </project>

在里面我们真的看到了一些文件夹的配置信息,猜想正确。里面还包含了一些仓库地址,还有一些profiles的内容等等,暂时先不去管太多。

【知识点】Minimal POM

Minimal POM不是与Super POM对应的,应该是对于一个POM而言,需要提供的最基本的元素有哪些。那么来看一下最基本的元素吧。

  • project根元素
  • modelVersion-应该被设置成4.0.0(maven2和maven3都是这样)
  • groupId-项目组的id
  • artifactId- 在给定组下的artifact的版本

下面是一个例子:

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
    </project>

groupId和artifactId和version这三个元素的值决定项目中完整的有效artifact name。格式如下:
<groupId>:<artifactId>:<version>,上面代码的完整有效的artifact name 就是"com.mycompany.app:my-app:1"
如果没有指定的就会是默认的打包类型。


【疑】Minimal POM,关于Minimal POM的概念还不是很清楚,他到底是不是除Super POM之外的统称呢?还是如我理解的这样呢?

2.创建pom.xml文件

回到刚才创建的pom.xml文件。输入一下命令。
sudo vim ./hello-world/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.ort/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.mycom.app</groupId>
        <artifactId>hello-world</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>Maven Hello World Project</name></project>

可以看出,第一行是XML头,project是POM的根元素。而之后都是就是一些配置的元素。
看一下第一个子元素:
modelVersion:当前的POM模型的版本。对于maven2和maven3来说他只能是4.0.0
groupId:组的Id,表示此项目属于哪个组,那个组的Id是什么?例如:如果你的公司是mycom,有一个项目为myapp,那么组的id就是:com.mycom.myapp
artifactId:这个是当前Maven项目在组中唯一的id,也就是这个id要体现他自己的功能,并且要独一无二。因为一个大型的项目会有很多功能模块,所以会有不同的artifactId。
version:就是当前项目的版本,值得注意的是这里的版本是1.0-SNAPSHOT,意为1.0快照,表示当前版本处在开发中,不是稳定的版本。
name:不是必须的,只是对于用户友好的一个项目名称。

3.编写主代码

项目的主代码所在的文件夹是:src/main/java
项目的测试代码位于:src/test/java
所以要依次创建文件夹。
然后书写代码如下:

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

我们重新梳理一下。看一下目录的结构

【注】之前的图有错误,文件结构是hello-world,而不是写的helloworld,现在在想要不要更改,java文件中包的地址呢当我把Helloworld中的包地址,修改为hello-world时出现错误,因为不允许-出现,后来我又把package直接删掉,依然能够运行。还是不太理解这里。

这些个目录就是groupId和artifactId共同决定的!

该Java类的包名是com.mycom.app.helloworld

这时候,在项目根目录下,即与pom.xml相同的文件夹下面执行:mvn clean compile

clean告诉Maven清理输出目录target/ ,compile告诉Maven编译主代码。

运行后的目录结构

【知识点】生命周期

刚才的命令,看的是云里雾里,了解下生命周期吧。
什么是生命周期呢?人的生命周期有哪些?---出生 满月 少年 青年 中年 老年 死亡

这就是生命周期,Maven是以构建生命周期为核心的理念。意思就是说从构建到发布一个artifact(project)得到了清晰地定义。

意思就是现在你仅仅需要学会一系列命令就可以轻松的创建任何一个Maven项目,其他的工作都交给POM去办,POM会确保他们都得到相应的结果。

Maven中有三种内嵌的生命周期,default clean site,default生命周期处理项目的部署,clean生命周期处理项目的清理,site生命周期处理项目站点文档的创建。

构建生命周期由以下阶段组成
下面的列表包括了default`clean site生命周期的的执行顺序。直接截取官方文档。


明天计划完成的内容

1. 继续学习Maven,将今天剩下的部分写完。

2. 争取学习以下idea的操作,熟练使用。

3. 用idea创建Maven项目,并熟悉聚合啊 啥的操作,,,(此条争取吧,时间应该不够)



遇到的问题

问题都在上面的文章的【疑】或者【注】中给出,下面自问自答一下吧。有可能理解错误。

1. 在官方文档中,Minimal POM是指的是什么呢?


自问自答:这个意思是最小化的意思,我的理解是POM最基本的元素,也就是说一个POM文档,必须包含project modelVersion groupId artifactId 这些最基本的元素。


2. 关于在编写主代码的时候,也就是/src/main/java中的代码时,到底需不需要使用package关键字?


自问自答:对于这个问题,我忽然觉得好像我对package和import有点误区。

https://segmentfault.com/a/1190000013609328


通过上面的文章学习,还是有必要写package 的。


收获

1. 该写的收获都写完了,so,bye






返回列表 返回列表
评论

    分享到