你的位置:首页 > Java教程

[Java教程]eclipse新建maven项目(一)


首先看一下eclipse版本,我用的是最新版Mars2。

下载地址自行搜索关键字:“eclipse官网”即可,注意下版本,32bit or 64bit。

maven插件以及svn等相关插件安装设置问题不在这里赘述,有时间的话会发布出来。

在这里说一下,第一、关于中文和英文的问题,虽然很多人表示看不懂英文,但是我不建议汉化eclipse,推荐原版,原版虽是英文但是单词有限,习惯了就好了;第二、eclipse和myeclipse哪个更好用,我表示这两个都是工具而已,不是很重要,起码我不在意工具的种类。

 

接下来是这样的

序号1:Create a simple project (skip archetype selection) :创建一个简单的项目(跳过对原型模板的选择)

序号2:User default Workspace location:使用本地默认的工作空间

Loaction:本地工作空间目录

序号3:Add project(s) to working set :增加项目到工作集

Add project to working sets是起到了把项目分类的作用,把Project Explorer中的项目按类分组,避免Project Explorer中项目过多。如图:

序号4:Advanced(高级)

resolve workspace projects(解决工作空间中的项目)

Profiles是maven的一个很关键的术语:profile是用来定义一些在build lifecycle中使用的environmental variations,profile可以设置成在不同的环境下激活不同的profile(例如:不同的OS激活不同的profile,不同的JVM激活不同的profile,不同的dabase激活不同的profile等等)。

Name template对应的是Eclipse中所创建Maven2项目的名称,也就是你那个项目的groupId,artifcatId。

针对原型模板目前为止不是很了解,还有由于目前尚未用到高级属性,所以不是很理解,恳请各位不吝赐教,我感激不尽。

在这里,我按照截图所示,直接进行next。

select an archetype(选择一个原型模板)

Catalog:Archetype Catalog下拉菜单有4个可供用户选择,分别是maven-archetype-plugin内置的Internal、本地仓库的Default Local、m2eclipse下载到仓库索引中包含的Nexus Indexer,以及所有这3个合并得到的All Catalogs。

Filter:对项目资源进行变量替换。

很多archetype.都是对应不同需求的maven模板,予选择 maven-archetype-webapp一个基于web的模板。

这一块的内容,予目前为止不甚了解,望各位不吝赐教,我感激不尽。

Group Id:组Id,针对一个项目的普遍唯一识别符。是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构,相当于我们日常使用的包名,例如:org.hhh,最好是填写公司或者组织名称。

Artifact Id:要新建的项目的名字,就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。一般GroupID就是填com.leafive.test这样子。

Version:版本号,默认0.0.1-SNAPSHOT

Packing:要将该项目生成什么类型,有jar,war,ejb,ear,rar,pom,maven-plugin,maven-archetype,osgi-bundle,eclipse-plugin

Name:名字(估计是模板的名字)

Description:说明

下图仅供参考:

点击finish后如图所示

会报错,不要着急,可以解决。

选中刚才新建的项目,然后鼠标右键

按照箭头指向的顺序来操作即可,操作完之后,进行下面的操作。

Tomcat版本以及jdk版本自己决定。

选则刚才选择的jdk版本,之后点击Apply,点击OK,项目不报错了。

这一项无法在可视化界面中更改,需要手动更改配置文件,打开刚才新建项目的文件夹目录,找到

改为2.5即可,保存,然后回到eclipse中刷新刚才的项目即可。

是不是改为了2.5了呢,对于这一项为什么要改,予目前为止不是很清楚,但是2.5用的比较多而已,恳请各位不吝赐教,我感激不尽。

项目清单如下图所示,由于版本问题,可能会有些出入,不过无伤大雅:

src/main/java:主要编码的目录。

src/main/resource:资源目录.如:spring的

src/test/java:测试的代码。

src/test/resource:测试的资源.如:spring的

Libraries下的JRE System Library:Java运行环境,默认JavaSE1.5,根据要求,对其进行更改,上面有修改的方法,也可以固定版本。

如果不固定的话,每次如上图所示升级maven项目的话,都需要手动更改,关于如何固定版本,后面会有提到,不要着急哦,当成网络小说,继续看。

Maven Dependencies:Maven的依赖项目,包括该项目下的依赖包。

Apache Tomcat包是因为这个项目是一个web项目,上面有提到,所以要用到Apache tomcat包。

JavaScript Resources同上。

src:对应src/main/java与src/test/java的class文件夹。

target:目标文件生成,例如要将项目生成jar就会生成到这个目录下。

pom.

提到配置文件或许会有很多朋友头疼,但是我要告诉朋友,想不头疼,别着急慢慢往下看。

双击pom.

竟然没有看到一个中文,不要担心,我带你嗨翻pom.

1. parent 给出父项目的位置,如果存在上一级父项目的话。如果没有特别指出的话,值就是父项目对于当前项目而言。位置是一个 as a group ID, artifact ID 和version元素的组合。
2.modelVersion 描述这个POM文件遵从哪个版本的项目描述符.
3.groupId 针对一个项目的普遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分(比如:org.apache.maven)
4.artifactId 在给定groupID 的group里面为artifact 指定的标识符是唯一的 artifact 代表的是被制作或者被一个project应用的组件。对于Maven项目的artifact 的例子包括:一些JARs, 原代码以及二进制的发布以及WARs.
5.packaging 这个项目生产出来的artifact 类型,举个例子 jar war pom Plugins 能够创建他们自己的包,包括包的类型,所以这个列表不可能包含所有可能的类型
6.name 当前项目的全称
7.version 当前项目产生的artifact的当前版本
8.description 当前项目的一个细节描述,当需要描述这个项目的时候被Maven所用,比如在web 站点中。 这个元素能够被指定为CDATA 类型,允许在描述器中HTML的tags, 并不鼓励用空白文本来表示。 如果你需要去修改生成的web 站点的索引页,你能够用你自己的索引来代替自动生成的文本。
9.url 当前项目的主页的URL
10.prerequisites 描述当前项目的编译环境的先决条件
11.issueManagement 当前项目的发布管理信息。
12.ciManagement 当前项目的连续集成信息。
13.inceptionYear 当前项目开始的年份, 用4位数字描述. 涉及到介绍情况时用作提供版权信息
14.mailingLists 包含的信息包括邮件列表
15.developers 描述当前的项目的开发人员的信息
16.contributors 描述对当前项目有贡献的人员的信息,不特指开发人员
17.licenses 这个元素描述了当前项目的所有的许可文件。每一个许可文件用一个许可元素来描述,然后描述额外的元素. 通常只列出适用于这个项目的许可文件以及适用于 依赖的非licenses。如果多个licenses都列出来了,那么假设这个用户选择其中的所需的,而不是接受所有的许可文件。
18.scm 指定当前项目中的版本控制工具,比如CVS, Subversion, 等等。
19.organization 这个元素描述这个项目所属组织的各种属性的描述。这些属性应用于文档创建的时候 (版权通知和链接).
20.build 创建项目时必须的信息。
21.profiles 本地项目编译档案文件时的列表,被激活时会修改build的过程
22.modules 模块 (有时被叫做子项目)作为当前项目的一部分.每一个被列出来的子模块都指向包含这个模块的目录文件的相对路径
23.repositories 发现依赖和扩展的远程资源库
24.pluginRepositories 发现plugins 的远程资源库的列表,主要是为了编译和报告
25.dependencies 这个元素描述了所有与当前项目相关的依赖.这些依赖被用作创建一个编译时的路径. 他们被自动的从资源库中下在下来依据当前项目的定义。如需更多信息,参看 the dependency mechanism
26.reports Deprecated.禁止适用。现在的版本中被 Maven所忽略掉。
27.reporting 这个元素包括报告的plugins 的指定,用作Maven生成站点的自动生成报告.这些报告将会运行当用户执行mvn site. 所有的报告将会包括在浏览器的导航栏中。
28.dependencyManagement 缺省的依赖信息将会从这个元素中继承。这些依赖在这一部分中被不立刻被解决的。当一个源于这个POM的元素描述了一个依赖根据匹配的 groupId 和artifactId,这个部分的版本和其他值用作那些还没有指定的依赖。
29.distributionManagement 对于一个项目分配的信息允许对于远程web服务器和资源库的site和artifacts配置。
30.properties 属性可以作为POM的自始自终的替换物,如果可行的话可以用作resources 的过滤器,格式是<name>value</name>

下面的是标准的,可能看着有点密集,对了,附带效果治疗密集恐惧症,下面的文章内容引自http://www.ibm.com/developerworks/cn/java/j-lo-maven/index.html予决定不错,很值得学习,故而张贴出来,好文章当共享,感谢下面的文章原作者,予对你表示致敬。

引用开始:

项目对象模型 POM-Maven 的灵魂

POM 即 ProjectObject Module,项目对象模型,在 pom.

清单 1. POM 文件示例
 <project 
  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd"> 
  <modelVersion>4.0.0</modelVersion> 
  <! – The Basics – > 
  <groupId> … </groupId> 
  <artifactId> … </artifactId> 
  <version> … </version> 
  <packaging> … </packaging> 
  <dependencies> … </dependencies> 
  <parent> … </parent> 
  <dependencyManagement> … </dependencyManagement> 
  <modules> … </modules> 
  <properties> … </properties> 
  <! – Build Settings – > 
  <build> … </build> 
  <reporting> … </reporting> 
  <! – More Project Information – > 
  <name> … </name> 
  <description> … </description> 
  <url> … </url> 
  <inceptionYear> … </inceptionYear> 
  <licenses> … </licenses> 
  <organization> … </organization> 
  <developers> … </developers> 
  <contributors> … </contributors> 
  <! – Environment Settings – > 
  <issueManagement> … </issueManagement> 
  <ciManagement> … </ciManagement> 
  <mailingLists> … </mailingLists> 
  <scm> … </scm> 
  <prerequisites> … </prerequisites> 
  <repositories> … </repositories> 
  <pluginRepositories> … </pluginRepositories> 
  <distributionManagement> … </distributionManagement> 
  <profiles> … </profiles> 
 </project>

在每个 POM 文件中都含有的元素是该 project 的坐标,它包含三个基本元素。

groupId 定义了项目属于哪个组,这有助于在大的范围上区别项目。artifactId 定义了这个项目在组中唯一的 ID。name 是一个用户友好的项目名称。

除了项目坐标外,modelVersion 指定 POM 模型的版本,version 指明当前项目的版本,packaging 指定了项目发布时的打包类型。

在下文中提及的插件,依赖,生命周期等也都有相应的 POM 元素在文件中有所体现。

Maven 插件和仓库

Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的。每个插件都能完成至少一个任务,每个任务即是一个功能,将这些功能应用在构建过程的不同生命周期中。这样既能保证拿来即用,又能保证 maven 本身的繁杂和冗余。

将生命周期的阶段与插件目标相互绑定,就可以在特定的阶段完成具体的构建任务。例如清单 2 中的代码就是要在 validate 这个阶段执行 maven-antrun-plugin 的 run 目标,具体的任务在 <target></target> 元素中定义。

清单 2. 插件
 <plugins> 
          <plugin> 
                  <groupId>org.apache.maven.plugins</groupId> 
                  <artifactId>maven-antrun-plugin</artifactId> 
                  <version>1.6</version> 
 <executions> 
 <execution> 
          <id>version</id> 
    <phase>validate</phase> 
    <configuration> 
 <target> 
    具体任务
 </target> 
 </configuration> 
 <goals> 
 <goal>  run  </goal> 
          </goals> 
 </execution> 
          </executions> 
          </plugin> 
 </plugins>

Maven 项目中的插件,依赖和项目构建的输出都可以由 Maven 的坐标进行唯一的区分,基于这种机制,Maven 将所有项目的构件文件放置在一个统一的位置,也就是 Maven 仓库。所有 Maven 项目可以从同一个 Maven 仓库中获取自己所需要的依赖 JAR,这节省了磁盘资源。实际的 Maven 项目中不需要存储依赖的文件,只需要在 POM 文件中生成依赖关系,在构建的时候 Maven 就会自动去仓库中下载。

在安装了 Maven 的机器上,会生成一个 ~\.m2\repository 目录,这个目录被称为本地仓库,当 Maven 查找需要的依赖时,首先会在本地查找,如果本地仓库中存在,则直接使用,否则 Maven 回去远程仓库查找,查找到后下载到本地进行使用。远程中央仓库的地址为 http://repo1.maven.org/。当然还有一些镜像仓库可供使用,有兴趣的读者可以参考 Maven 官方网站的相关介绍。

当个人所在的网络无法访问公共的 Maven 仓库时,可以在 settings.

清单 3. 代理
 <proxies> 
   <proxy> 
      <active>true</active> 
      <protocol>http</protocol> 
      <host> 代理地址 </host> 
      <port>8080</port> 
      <username> 用户名 </username> 
      <password> 密码 </password> 
    </proxy> 
 </proxies>

依赖、聚合和继承

  • 依赖

我们项目中依赖的 Jar 包可以通过依赖的方式引入,通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。通过控制依赖的范围,可以指定该依赖在什么阶段有效。Maven 的几种依赖范围:

表 2. 依赖范围

名称

有效范围

compile

编译,测试,运行。默认的依赖范围。

test

测试,如 Junit。

runtime

运行,如 JDBC。

provided

编译,测试,如 ServletAPI。

system

编译,测试,依赖于系统变量。

清单 4 中表示引入对 Junit 的依赖 , 这个依赖关系产生作用的阶段是 <scope>test</scope>。

清单 4. 依赖
    <dependency>  
      <groupId> </groupId>   
      <artifactId> </artifactId>   
      <version> </version>   
      <optional>true<optional>  
    </dependency>

依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,也可以用 <optional> 去除这种依赖的传递,如清单 5。

清单 5. 选择性依赖
 <dependency> 
 <groupId>commons-logging</groupId> 
 <artifactId>commons-logging</artifactId> 
 <version>1.1.1</version> 
 <optional>true<optional> 
 </dependency>

假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性,那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖,exclusions 可以包含一个或者多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。如清单 6。

清单 6. 排除依赖
    <dependency>    
         <groupId>org.springframework</groupId>  
         <artifactId>spring-core</artifactId>  
         <exclusions>  
               <exclusion>      
                    <groupId>commons-logging</groupId>          
                    <artifactId>commons-logging</artifactId>  
               </exclusion>  
         </exclusions>  
    </dependency>

  • 聚合

现实中一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。如清单 7,其中 <module></module> 中间的内容为子模块工程名的相对路径。

清单 7. 聚合
  <modules>    
 <module>../com.dugeng.project1</module> 
 <module>../com.dugeng.project2</module> 
  </modules>

父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java 目录。Maven 会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。

  • 继承

在面向对象的编程中我们学会了继承的概念,继承是可重用行即消除重复编码的行为。Maven 中继承的用意和面向对象编程中是一致的。与聚合的实现类似,我们通过构建父模块将子模块共用的依赖,插件等进行统一声明,在聚合和继承同时使用时,我们可以用同一个父模块来完成这两个功能。

例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块,那么我们在 project1 和 2 中用如下代码声明父子关系,如清单 8:

清单 8. 继承
 <parent> 
  <groupId>com.dugeng.mavenproject</groupId> 
  <artifactId>com.dugeng.parent</artifactId> 
  <version>0.0.1-SNAPSHOT</version> 
  <relativePath>../com.dugeng.parent/pom.
 </parent>

由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。

聚合和继承存在一些共性和潜在的联系,在实际的应用中,经常将聚合模块的父模块和继承的父模块定义为同一个。

并不是所有的 POM 元素都可以被继承,表 3 是一个可继承的元素列表。

表 3. 可继承元素列表

名称

描述

groupId

项目组 ID

version

项目版本

description

描述信息

organization

组织信息

inceptionYear

创始年份

url

项目的 url 地址

developers

开发者

contributors

贡献者信息

distributionManagerment

部署信息

issueManagement

缺陷跟踪系统

ciManagement

持续继承信息

scm

版本控制信息

mailingList

邮件列表信息

properties

自定义的属性

dependencies

依赖配置

dependencyManagement

依赖管理配置

repositories

仓库配置

build

源码目录,插件管理等配置

reporting

报告配置

Maven 属性

在 POM 文件中常常需要引用已定义的属性以降低代码的冗余,提高代码的可重用性,这样不仅能降低代码升级的工作量也能提高代码的正确率。有些属性是用户自定义的,有些属性是可以直接引用的已定义变量。

Maven 的可用属性类型可分为 5 种,它们分别是:

  1. 内置属性。这种属性跟 Maven Project 自身有关,比如要引入当前 Project 的版本信 息,那么只需要在使用的位置引用 ${version} 就行了。
  2. Setting 属性。上文中已经提到 Maven 自身有一个 settings.
  3. POM 属性。这种属性对应 POM 文件中对应元素的值,例如 ${project.groupId} 对应了 <groupId></groupId> 中的值,${project.artifactId} 对应了 <artifactId> </ artifactId > 中的值。
  4. 系统环境变量。可以使用 env.${name} 来获得相应 name 对应的环境变量的值,例如 ${env.JAVA_HOME} 得到的就是 JAVA_HOME 的环境变量值。
  5. 用户自定义变量。这种类型的变量是使用最频繁和广泛的变量,完全由用户自己定义。在 POM 文件中加入 <properties> 元素并将自定义属性作为其子元素。格式如清单 9。
清单 9. 自定义属性
<properties>
  <path>../../sourcecode</path>
</properties>

Maven 3 的新特性

Maven 3 在性能和灵活性方面都比 Maven2 有了很大提升,它的新特性总结起来有以下几点:

1. 兼容低版本 Maven,也就是向后兼容,因此用户可以将 Maven2 的项目移植到 Maven3 上来。

2. 性能优化。CPU 利用率更高,内存消耗更小,经过优化的 Maven3 比 Maven2 构建速度快出 50% 以上,这对于构建大型项目的开发者来说无疑会节省大量的时间。

3. 在早先的版本中,开发者必须在子模块中指定父版本,当进行代码的迁移或升级时,这会带来额外的维护工作,Maven3.1 将会消除在子模块上指定父版本的需要。

4.Maven3 改善了错误报告,它会在错误报告中提供指向 Maven Wiki 页面的链接,这样开发者可以方便的查看更全面的错误描述和可能的原因。

5. 增加了 Maven Shell,通常我们可以在系统自带的 console 里执行 Maven 命令,但是通过自安装的 Maven Shell 可以提高生成速度,它是一个是 Maven 的命令行接口工具,可以缓存解析过的 POM,避免了重复调用 Maven 的启动成本。Maven Shell 不属于 Maven 发行包的一部分,需要单独下载。

6. M2Eclipse 实现了 Maven 和 Eclipse 的集成,与一个使用更广泛的 IDE 进行集成从而为开发者带来的便利是不言而喻的。

结束语

Maven 有着许多实用的特点,它使用了标准的目录结构和部署。这就使得开发人员能够适应不同的项目,并且不用学习任何结构方面新的东西,也不用掌握特殊的指令来构建结构。当然,Maven 的使用还不够普及,相信随着时间的推移,它的功能会更完善,使用的人群也会越来越广泛。

 引用结束。

转载请注明出处,谢谢。