电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Maven起步——教你开始使用Maven二(图)


发布日期:2024/6/6
 

现在运行jar目标并且看看Maven的输出吧它将包含下面如下这些

Attempting to download springcorejarK downloadedAttempting to download springwebjarK downloaded

显示了jar目标触发的一系列事件

Maven查看POM依据projectxml的定义看到在springframework组中的两个人造物的依赖关系它将载你本地Maven的资源库中检查springcorejar和springwebjar

当Maven找不到这些文件它将到寻找JAR文件这些JAR文件会被下载并放置于你本地Maven的资源库中它们也被添加到你项目的classpath中下次在你的项目查询这些文件时Maven将在你本地的资源库中提供它们

Maven本地和远程资源库为test application项目提供的spring Jar

刚刚发生了什么?

Maven为你节省了相当的时间和不必要的麻烦Maven到来之前依赖关系常常被捆绑到一个项目的目录或者项目应该指向到添加正确的JAR到你的classpath使用Maven管理依赖关系显然有着明显的优势作为初学者如果你的项目依赖个外部的JAR文件这就不需要在你的资源库中存储成兆的JAR文件这意味着当你在项目的外部检查资源控制的时候更少的存储空间和更快的下载时间另外如果你有多个项目依赖相同的外部依赖Maven仅需要下载一次依赖关系并且每个项目引用一个单独的副本在你本地的资源库中当依赖关系能够从Maven资源库远程下载的时候没有强制的原因让你存储你项目的依赖关系的版本

当Maven下载依赖关系其在你本地的机器上从远程的Maven资源库拷贝一个文件到你本地的Maven资源库Maven如何定位依赖关系的?它使用projectxml中dependency元素的信息如图所示

POM和Maven资源库的映射

指定的groupId告诉Maven查看特定的目录springframework指定type告诉Maven查找特定的子目录如jar和war(注意s是Maven附加到type元素上的)本例中type是被忽略的JAR类型是默认类型当你指定了artifactId你正告诉Maven哪个文件将从jar目录下载顶级目录表现为组标示符JAR文件名的第一部分表现为artifact标示符文件名最后的部分包括扩展名表现为version标示符Maven使用下面的公式来决定一个来自于资源库中的依赖关系[REPO_ROOT]参考你远程的资源库

[REPO_ROOT]/<groupId>/<type>s/<artifactId><currentVersion><type>

提示

Maven的说明中资源库可能开始于类似Java包的结构作为springframework的替代groupId被提议的结构为orgspringframework另外每个版本将有一个分隔目录用以增加Maven资源库的效率更多有关改变的提交建议参见 MAVEN/Repository+Layout++Final

一个本地的资源库来处理依赖关系在Unix机器上你的Maven资源库能在~/maven/repository目录找到在Windows机器上你的Maven的资源库在你的%USERPROFILE%目录如果你看一看本地Maven的资源库你将会注意到它正包含一个springframework的目录%USERPROFILE%\maven\repository\springframework\jars目录包含springcore依赖关系的两个springcorejar文件和springcorejarmd文件其包含MD文件用于验证sprintcore JAR文件的完整性Maven 当前并没有使用MD来验证完成品的完整性但在将来的版本可能会用其来验证完成品的完整性

提示

在Windows机器上%USERPROFILE%通常决定于C\Documents and Settings\vmassol这种目录%USERPROFILE%被用在Unix的主目录(%USERPROFILE% isused in the spirit of the abbreviation for a Unix home directory

关于使用id元素?

如果你工作在现存的Maven项目你可能有依赖关系使用id元素下面的dependencies元素示范了使用单独id元素来附加Jakarta Commons Math的版本<dependencies><dependency><id>commonsmath</id><version></version></dependency></dependencies>单独使用id元素工作仅在groupId和artifactId匹配时如果你浏览Maven资源库你将看到下面的目录结构

/commonsmath

/jars

commonsmathjar

commonsmathjar

使用id元素工作单独的id标记已经不被赞成使用并在Maven 中消失当你看到别的Maven项目中使用dependencies的速记符号时请尝试使用groupId和artifactId来标识你的依赖关系

依赖快照

如果你开发的程序依赖的依赖关系经常改变你可能想将依赖的每个依赖关系替代为最近构件的硬编码的版本在一个项目依赖的依赖关系还处在beta的版本或你正开发一系列项目依赖的Maven项目时时特别有用这将在第章论述本实验你将学习到如何依靠快照

我该如何做?

在你的依赖关系块儿中指定一个明确的版本使用SNAPSHOT关键字作为版本名称的一部分每次你执行Maven目标时Maven将从远程资源库中检查较新的依赖关系如果远程资源库的版本较新Maven将下载其到本地资源库例如下面的依赖关系将一直下载spring的新版JAR文件

<dependency>

<groupId>springframework

</groupId>

<artifactId>spring

</artifactId>

<version>SNAPSHOT

</version>

</dependency>

刚刚发生了什么?

当你使用SNAPSHOT依赖关系你正告诉Maven使用远程资源库的最新版本在你使用多项目插件或者当你依赖的一个完成品尚处于开发阶段这将得心应手在你工作的团队仅有较少的开发者组成时最好也常这么做你将使用SNAPSHOT依赖关系当你的项目依赖一个最近的开发或者非正式版本的特别组件SNAPSHOT依赖关系应该在开发阶段被保留并且概括说你不用改发布一个依赖于SNAPSHOT依赖关系的项目

执行脱机构建

如果你需要在一个离线的情况下使用Maven你可能需要知道如何确使Maven不检查最新的SNAPSHOT依赖关系本实验将向你展示如何用Maven执行脱机构建

我该如何做?

这个方法很简单仅仅使用o命令行选项例如如果你没有网络连接但又想执行测试目标运行Maven o testMaven将执行这个test目标而不检查依赖关系如果你的项目没有依赖SNAPSHOT构建你也可以断看你的环境来添加o标志如果你依赖SNAPSHOT构建你将需要使用o标志Maven将在每次执行目标时尝试检查最新的SNAPSHOT在这种情况下不使用o标志本项目将不会构建成功

关于 执行离线构建如果你不想下载任何完成品?

当然这将不会工作离线构建的工作你必须已经有必需的依赖关系在你本地的资源库项目最简单的获得Maven下载依赖

关系的方法是在每个Maven项目实例简单的运行noop目标build:start这个目标执行之前任何其它的目标并不执行任何动作如果你运行build:startMaven将从projectxml获得获取任何依赖关系

使用Maven控制台

如果你再三的从命令行运行Maven你可以通过Maven控制台来节省时间Maven控制台提供一个外壳在这你可以键入目标的名称来执行Maven通过使用Maven可以避免每次载你想运行一个Maven目标时Java Virtual Machine(JVM)启动的等待

我该如何做?

Maven Console是一个插件你可以通过键入maven console在命令提示符这将产生下面的输出

__ __

| \/ |__ _Apache__ ___

| |\/| / _` \ V / _) \ ~ intelligent projects ~

|_| |_\___|\_/\___|_||_| v The following commands are available:list list all available goalshelp this message<goalname> attain a goalquit quits the consoletestapplication >

目前你可以在命令行执行任何你能执行的目标开始是一下键入 java:compileMaven将执行 java:compile目标并返回提示符其它的目标在一个序列中运行两个目标你可以在提示符处输入它们通过空格例如 clean test众所周知作为goal chaining这是你想通过Maven获得指定一系列目标的方法退出Maven Console键入quit查看有效目标列表键入list

刚刚发生了什么?

在Maven Console下Maven执行java:compile目标非常之快不信么?当你使用Maven Console时你所执行的目标是在一个现成的JVM下当你从命令行运行Maven时你每次运行一个目标都不得不等待JVM的启动如果你不确信其对性能的提升自己试试看在命令行下运行java:complie 再在Maven Console下同样运行java:compile 注意时间的差别你将发现JVM启动的时间开始增加如果你找到你自己常用的Maven目标Maven Console将通过启动JVM一次为来节省时间

生成Eclipse项目

我打赌你一定想在IDE下工作Maven通过插件来与EclipseInelliJIDEAJBuilderJDeveloper以及Emacs集成Maven很好的与全部这些工作集成本实验关注

上一篇:用JFace和SWT构建简单的应用程序

下一篇:substring的参数及字符串判断