マイクロチャネル公共番号[黄色]小さなランププログラマのメーカー、インターネット業界の新しい知識、生涯学習の実践者。懸念は「、 "のiOS"、 "PubMedの"、 "AI"、 "アンドロイド"、 "フロントエンド"、 "ジャワ"、 "パイソン"、 "C ++"、 "ビッグデータ"、 "機械学習"、 "アルゴリズム" 返信した後BAT「」学校のトリック「」書かれた「」インタビュー「」表面が対応する無料の学習教材を介して取得することができます「」コンピュータの基本「」LeetCode「およびその他のキーワード。
マイクのビルド道路(上)
編集者:劉新 ヤードの農家が立って 2016年7月10日に
- 要約:手のいずれかのトラブルを構築し、都市と彼のガールフレンドに滞在し、マイクは確かにノースカントン闘争に行きます。今、彼は唯一、2.5行のこの街に滞在、このソフトウェア開発会社、7-8人、10丁の銃を入力することができ、一般的なソフトウェアの小さなワークショップです。まず、仕事の日、CTO兼チーフアーキテクト、プロジェクトマネージャや開発チームのリーダー張Liが行くようにと呼ばれる、彼は教え込むは言った:「李は、ああ、私はあなたの履歴書を読んで、私は同社の開発についてかなり楽観を教えてくれしかし、このプロジェクトは非常に重要な課題であることを支援しながら、学びながら、新人として、あなたは新しいビジネスに精通していない、この時間をコアシステムを開発することはできません、あなたが望む:あなたは私に戻って引っ張っている」アランの心を構築彼女は思ったものの、英語ああ、マイクか
-
ハンドビルドのトラブル
それは彼のガールフレンドのためではなかった、広州李の北に、街に滞在した場合、確かに行くことに苦労しています。
今、彼は唯一、2.5行のこの街に滞在、このソフトウェア開発会社、7-8人、10丁の銃を入力することができ、一般的なソフトウェアの小さなワークショップです。
仕事、CTO兼チーフアーキテクト、プロジェクトマネージャや開発チームのリーダー張リーの最初の日は、彼が教え込む行くために呼び出さ言いました:
「李ああ、私は同社の開発にあなたのために持っている、あなたの履歴書を読んで非常に有望であるが、新人として、あなたは新しいビジネスに精通していない、この時間をコアシステムを開発することはできません、あなたが望む学びながらビルドの ":プロジェクトは非常に重要な課題であることを支援しながら
彼女は思ったが、あなたは英語で私に戻って引っ張るアランの心は、ああ、マイクはまだ静かに、尋ねた笑顔:
「このビルドは何ですか?」
張は言った:「私は非常に忙しい、あなたに説明する時間は、ここにあなたが知っている参照、文書ません。」
その後、張訓練と準備紙の彼数枚は、コメントを追加しました:「王を聞いて質問がありますが、彼はあなたがすでに非常に身近なビルドを行うよりも、月に来ていました」
マイクは慎重に再びそれを読んで、読んで:
XXX会社ビルドプロセス(テスト環境)
(1)、UTF-8としてエンコードされ、JavaコンパイラレベルJDK 1.7をEclipseワークスペースを設定します
(2)EclipseのワークスペースにSVNから最新のソースコードをダウンロードしてください
(3)作業領域は、コンパイルエラーがないことを確認しEclispe
(4)手動で次のプロファイル20を修正します
database.properties
cache.properties
user.properties
......
(5)戦争パッケージにEclipseのWebプロジェクトの輸出で
王はまた、特に赤ペンでここにマークを追加しました:WebプロジェクトでのJava他の項目は自動的に戦争WEB-INF / libディレクトリのパッケージに含まれます依存
(6)テストサーバーにアップロードし、インストールします
(7)煙試験を行うこと
李は微笑ん:それはまた、ビルドを処理テストし、コンパイル、パッケージには、展開することではありませんか!
ちょうどその時、李と呼ばれる小柱の発展のバックボーン:「アランは、私はすぐにテストするために、いくつかのバグを変更し、かつ迅速に私はテスト環境を構築しました。」
李はない怠慢、文書すぐに再びそれを行うによると、それが完了する前にトスのほぼ半分の時間を要しました。
しかし、最後のステップに、時間のスモークテストを行い、システムが起動しませんでした!
マイクは唯一のテスト環境はJDK 1.6であることを見つけるのに長い時間をチェックしますが、ビルドドキュメント上の書き込みは1.7を実行しないのは勿論です。
李王は密かに前任者を呪う:ここでは、子供は、ドキュメント上にマークされていないどのようにピットがある知っている必要がありますか?
すぐにテスト環境に置かれる新しいビルドは、渡された煙をテストします。
ただ、安心、テストシャオ趙はアウトと呼ばれる:「小柱、あなたがいないバグ修正ああを持っていること」
小柱本能的な反応の開発のバックボーンは:「それは、私は地元のコードをテストしているにも提出されたコードは不可能です!」
マイクへの非難ポイントの骨梁は、指:「アランはいねえ、あなたのビルドは再び間違っていないです。」
李心を開始し、かつ迅速に確認するために行って、案の定、データベースは間違いを犯すと、ステップ4で、設定ファイルを変更し、ライブラリーの開発ではなく、テストライブラリを指します。
すぐにそれを変更する、それが厳格な注意の下で長官王、開発とテスト小柱シャオ趙フロントの目の3組、Liは発汗しなければならない頭を構築し、王にも乗るために沿って走ったビルドしなければなりませんでした。
幸いなことに、三回目は最終的に成功しました。すべてのテストが合格しました。
(実際には、マイクが緊張多忙でJDK 1.6を変更、文書を更新するのを忘れ)
だから、一週間後、マイクはますます成熟し、少なくミスを行うためにも、毎日震え4または5のビルドを行いますが、それでも毎日多くの時間を取る必要がありました。
最高の年はビルドではまだでしょう無駄、同社はできません。
自動ビルドマイクは単にコマンドを実行し、このマニュアル、自動化に骨の折れる、エラーが発生しやすいビルドアップ、テスト環境を構築やっている未来人を置くことにしました。
それを達成するためにどのような言語?もちろん、Javaの大法が良い!リー長い間練習の大学であり、デザインパターンは頂点に達し、ついに遊びに来て、OOと思います。
李は、彼らがあきらめる前に、12ポイントに自動ビルド、乾燥した日を開発し、それを返さ夕方に、日中働きました。
しかしマイクは、彼らが自分にインスピレーションを与え、時にはとても幸せな気分にしているすべての人のアイデアの利益のための新しいツールを作成するため、スリープ状態に毎日寝るには消極的である、疲れを感じることはありません。
一ヶ月後に、新たに自動化ツールを焼き、これは実際のJava APIのセットで、李はBuildToolのV1.0は、ソースコードをダウンロードし、コンパイル、パッケージ、展開、テストするために専用にそれを呼びました。
あなたはJavaコードをコンパイルする場合たとえば、あなたは書くことができます。
李はどちらかのJavaソースファイルのパス、それはファイルのコレクションを表し、この抽象をファイルセットすることは非常に誇りに思っている、パスがクラスパスかもしれません。
その他のAPIは、ソースコード、包装、展開をダウンロードしたいと、テストは同様です。
今、マイクは本当に唯一のビルドを作成する環境をテストすることができ、コマンドを実行する必要があります。
JavaのBuildToolテスト
突然はるかに少ない労力のすべて、およびマシンが実行され、基本的に間違って行くことはできません。
李は自動化されたBuildToolため、同社は、賞を得たが、また少しを支払います。
マイクの場合は、これが最も重要ではありません、最も重要なのはこのBuildToolの設計と実装を通じて、彼らの能力が大幅に改善されました。
これは、HTMLがスタッフの唯一のSSHフレームワークと空白を埋めるだけではなく、持っています!
コメントコード農家はスタンド:ほとんどの人は挑戦せず、現状でのみ問題が発生しますが、プロジェクトは非常に退屈だと文句を言うだろう、
少数の人々は仕事で、「痛みのポイント」の問題を発見し、実際に自分自身と他人を区別するための重要な方法を作るうちに自分自身を向上させることにある値を持って、それを解決するために開始されます。
XML対JAVA今年の状況は非常に良いですが、良いビジネスの開発は、新しいの数を募集、突然、それはマイクがこれらのプロジェクトのために自動化されたビルドを構築するために自ら申し出、3つのまたは4つの新しいプロジェクトを取りました。
しかし、李はすぐに機能を達成することができるが、Java言語を直接使用することは、書くこと、それはあまりにも面倒なようで、問題を発見しました。
彼らが理解するために考えるべきいくつかの日を持って見て、独自のコードを記述します。
それはあなたがああも設計されたBuildToolのAPIの設計を?所有していません。
2日間について慎重に考えて、李は最終的に問題を実現しました:ない独自のデザインのJava言語は再びあまりにも「低」で、良いではありません!
実際に記述するために自動化タスクを構築し、どのような運用レベルです。
そして、Javaで普遍的な言語は、何かを読み書きすることが困難となる、あまりにも多くの詳細の導入を書くためにそれを使用することを確認することができます!
李は考えた:あなたはそれを構築し、自動化するために使用される新しい、専門的な言語を開発することはできますか?
(コード農家は注意をめくる:これは実際には、いわゆるドメイン固有言語であるDSLと呼ばれる(ドメイン固有言語))
しかし、少し高い費用がかかることがあり、新しい言語、良いよりも少し害を開発。
小李Baisiはあなたが議論の中小柱の設定ファイルとプロジェクトマネージャーが聞こえるまで、1日休止状態、理由を理解突然休止状態、春のように考えてシステムを記述するためにXMLを使用しています。
マイクはすぐに一瞬のためにXMLで記述されたJavaコンパイラプログラムを入れて「それはまた、私のBuildToolのはああを記述するためにXMLを使用することができます」。
それは本当に多くのクリーナーです!そして、元のJavaプログラムに比べて、このXMLは、ほとんど自明です!
XMLは非常にスケーラブルであり、それは、このような論理的なビルドを記述するために使用される<javacの> <SRCDIR> <クラスパス>として任意のカスタムラベルすることができます。
しかし、不快で唯一の場所:XMLはばかりプレーンテキスト、そのようにJavaプログラムを実行することはできません。
不过这也无妨,只要用Java写一个解析器,用来解析这些XML文件然后在Java中执行就可以了。有了BuildTool V1.0作为基础, 写一个解析器不是什么难事, 很快 BuildTool V2.0 就新鲜出炉了。
小李不再帮其他项目组去写Build 程序,因为用XML描述以后,大家很快就能学会, 并且乐在其中。
CTO老张看到这个工具,大为赞赏, 它给小李说: “别叫什么Build Tool, 太俗, 别人听了一点感觉都没有, 我给你起个名,叫 ANT ”
"ANT? " 小李似乎看到很多小蚂蚁在不辞劳苦帮着做Build, 心里暗暗佩服老张: 这个名字起的太好了, 姜还是老的辣啊。
小李的Build之路(下)
转自: 刘欣 码农翻身 2016-07-12
前言: 接上一篇《小李的Build之路(上)》
小李发明的ANT确实是好用, 现在不仅仅是小李的公司, 连其他公司的朋友听说了,也拿去使用, 交口称赞。
只是小李发现了一点奇怪的现象,每个人在开始写新项目的Ant build文件之前, 都会找到自己说:
“小李, 把你那个build.xml 文件发我一份吧, 让我参考下。”
小李的那一份build.xml其实是自己项目的第一个ant 脚本, 为啥大家都要把它
Copy走呢? 刚开始的时候小李以为大家不会写,要按照自己的模板照葫芦画瓢。
偶然有一次,小李看到了别人项目的Ant build脚本, 不由得大吃一惊, 这简直和自己原始的build.xml如出一辙。
小李赶紧把公司内所有项目的Ant脚本都要过来,仔细观察了一下, 很快就发现了这些脚本中蕴藏着一些共同的“模式”,这些模式主要体现在Build的步骤上:
1. 从版本控制系统下载代码
2. 编译java 文件,形成jar包
3. 运行单元测试
4. 生成代码覆盖度报告和测试报告
4. 打包形成war 文件
5. 上传到测试服务器上,进行安装
其实这也难怪,实际的Build不就是这样的嘛。 但是中间也有不同之处:
(1) 路径不同,例如
java 源文件 下载下来以后放的位置不同,五花八门
编译成的java class 放置的位置不同
测试报告放置不同
war包生成后放置的路径不同
。。。
(2) 项目依赖不同,例如
各个项目依赖的第三方jar包可能是不一样的
各个项目都有一个Web子项目,它依赖于其他java 项目,所以在build的时候,要先build这些java 项目才行
例如下图中的OnlineShop,这是个Web项目, 它依赖于ApplicationConfg, LoggingFramework, OnlineShopApi这三个子项目。
项目依赖这个没办法, 毕竟是各个项目的业务所要求的,小李没有办法改变。
但是那些不同的路径真的是必要的吗? 能不能让大家的路径都保持一致呢 ?
一个新的主意像闪电一样划过黑暗的夜空:
确实可以保持一致, 但是大家都要遵循一定的约定
如果大家都这么做,小李就可以增强一下Ant,只要运行ant complie , 就会自动的去src/main/java 找到源文件进行编译, 只要运行ant test, 就会自动去src/test/java 找到测试用例, 编译并运行。
换句话说,只要遵循目录的约定, 大家就不用费心费力的指定各种路径了, 一切在背后由工具自动搞定, 这样的话Build脚本就可以极大的简化了,只需要寥寥几行即可。
这只是一个java项目,要是多个java项目,有依赖关系,像上面提到的 OnlineShop 依赖OnlineShopAPI, AppplicationConfig, LoggingFramework , 该怎么处理?
这也不难, 小李想,首先每个java项目都得遵守上述约定,其次需要定义项目之间的依赖关系, 也可以用XML描述出来。
每个java项目都需要有个叫pom.xml的文件, 例如OnlineShop这个项目的pom如下:
这样以来工具就能自动找到被依赖的项目, 然后去编译打包它了。
此外,各个java项目之间也需要按约定来组织目录,例如:
+- pom.xml
+- online-shop-web
| +- pom.xml
| +- src
| +- main
| +- webapp
+- online-shop-api
| +- pom.xml
| +- src
| +- main
| +- java
+- logging-framework
| +- pom.xml
| +- src
| +- main
| +- java
+- app-config
| +- pom.xml
| +- src
| +- main
| +- java
如果扩展一下, 把第三方的jar 文件例如JUnit 也可以给用这种方式来描述:
想到这一层,小李不禁激动起来,因为第三方的jar 管理一直是一个令人头疼的问题,最早的时候大家都是手工的Copy来Copy去, 由于版本不同导致的错误特别难于发现。
每个人在建立自己Eclipse workspace的时候, 得拿到所有依赖的jar包, 并且在项目上设置好, 可是非常的费劲啊。
如果利用这种声明的办法, 每个人岂不卸下了一个巨大的包袱 ?
当然公司需要建立一个公用的第三方jar 文件版本库, 把公司最常用的第三方jar包都放进去, 工具在分析项目的配置文件pom.xml的时候,就可以去公司的版本库里去读取并且下载到本地。
将来有新人进入公司, 只要给他一个pom.xml , 用Eclipse导入,就能轻松的把一个可以直接运行的workspace建立起来, 再也不需要设置那些烦心的jar了。
如果将来在网络上建立公开的软件版本库, 任何人都可以从那里去下载各种软件包,那受惠的可不仅仅是自己公司了, 而是所有人,真是一个激动人心的场景啊。
不过还是从自己公司开始吧, 小李冷静下来分析了一下: 让所有的项目组都使用约定的目录,并且建立一个公司级别的软件库,自己可是没有这样的权限啊, 小李去找CTO老张求助。
老张不愧是老江湖, 听了几分钟小李的介绍,马上就明白了, 并且把这个想法提升了一个高度:
“你这叫约定重于配置, 知道不? 从Ruby on Rails 开始,这个词开始流行了, 大家现在都很忙, Ant build脚本用的也没问题,先不改了”
小李还不死心: “可是这么做的话对以后的新项目大有好处啊,不用Copy 繁琐的build脚本了, 也不用费心的折腾workspace了”
“那也不能现在改,项目进度最重要,大家都没时间, 这样吧,等大家项目闲下来再改动如何? ” 老张妥协了一下。
可是在公司基本上就不会有空闲的时间, 一个个新需求压的大家透不过气来,偶尔有空闲时间,大家也都犯懒了, 总是想休息。
此外惯性的力量是惊人的,大家都愿意待在舒适区里, 不愿意变化, 虽然也看到了新工具的好处, 大家都懒得换新的。
时间过的很快,一年过去了, 小李看着自己辛辛苦苦加班写出来的Ant 2.0 , 还是无人采用, 很是伤心。
经过公司的允许, 小李决定把这个工具开源, 为了和Ant区分开来, 特地起了个新的名称: Maven。
Maven 迅速被大家用了起来,除了小李的公司。
又过了半年, 小李跳槽了。
(完)
(完)
Maven 三十分钟入门
阅读 1164
收藏 95
2017-05-08
原文链接:sadwxqezc.github.io
腾讯云移动开发者专区,一站式涵盖开发,测试,发布,营销、运维等全生命周期,有效降低技术门槛、减少研发成本、提升效率。立即了解详情:cloud.tencent.com
Maven
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model(POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
参考文档:Maven Documentation
Maven概述
一个基本的Pom文件
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Pom文件是面向工程的一个管理模型,全称是Project Object Model。这个Pom文件中包含的基本内容有:
- project pom文件的顶层元素
- modelVersion Pom对象模型的版本
- groupId 是创建这个项目的组织或部门的唯一标志,比如说
org.apache.maven.plugins
就是所有Maven plugins的groupId - artifactId 是这个项目生成结果的唯一标志,Maven生成结果的命名模式为
<artifactId>-<version>.<extension>
,比如说my app-1.0.jar
- packaging 这个参数表明了项目生成结果的打包模式,比如JAR,WAR,EAR等,同时这个参数还表明了build过程采用的特定生命周期
- version 这个参数表明了项目生成结果的版本,在version里经常会看到SNAPSHOT标志,它表明了项目处于开发阶段。
- name 这个参数代表项目的展示名字,通常作用在Maven生成的文档中
- url 这个参数代表哪里可以找到该项目,通常作用在Maven生成的文档中
- description 这个参数描述了项目的基本信息,通常作用在Maven生成的文档中
Maven项目的基本结构
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
上面是一个Maven项目的基本结构,项目的相关资源位于${basedir}/src/main/java
中,而测试的资源位于${basedir}/src/test/java
中,而pom文件位于pom.xml
中。
Maven的执行
1. mvn compile
执行mvn compile
,编译的结果会默认放在${basedir}/target/classes
目录下。
2. mvn test
执行mvn test
,会执行${basedir}/src/test/java
中的单元测试。如果只想编译测试代码而不执行,则执行mvn test-compile
。
3. mvn package
执行mvn package
会对项目进行打包,假如当前在pom中的packaging设定为jar,那么执行该命令后会在${basedir}/target
目录下生成对应的jar包。
4. mvn install
如果想把mvn package
生成的Jar文件安装在本地库中以让其它项目引用,则可以执行mvn install
命令,将生成的jar包放在${user.home}/.m2/repository
中。
Plugins
Plugins用来定制Maven项目的编译过程,假如要配置Java Compiler允许JDK 5.0的资源,那么只需要在Pom中增加如下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
<configuration>
中的配置会应用在对应Plugin的所有Goal。
资源文件打包
${basedir}/src/main/resources
目录下的所有文件都会被打包到Jar文件中,比如如下一个文件结构:
my-app
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- resources
| `-- META-INF
| `-- application.properties
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
该项目打包成Jar文件后的内部组织结构为:
|-- META-INF
| |-- MANIFEST.MF
| |-- application.properties
| `-- maven
| `-- com.mycompany.app
| `-- my-app
| |-- pom.properties
| `-- pom.xml
`-- com
`-- mycompany
`-- app
`-- App.class
文件过滤
Maven支持文件过滤的功能,可以在build时候为文件提供变量赋值,比如说上面的application.properties
文件中有如下定义:
# application.properties
application.name=${project.name}
application.version=${project.version}
那么需要在pom文件中做如下的定义:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
执行mvn process-resources
命令后,在target/classes
下找到application.properties
可以看到如下结果:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
可见其中形如${<property name>}
的变量已经被替换成了对应的值,如果要引入其它文件中定义的属性,只需要在pom文件中定义<filters>
,比如:
<build>
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
那么Maven会先读出filter.properties
中的属性,然后把这些属性注入对应的resources中。
Dependencies
<dependencies>
标签下列出了所有的外部依赖,比如下面的Pom文件添加了Junit的依赖:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<dependency>
的<scope>
标签的值可以为compile,test和runtime,当Maven编译项目时,它首先会在${user.home}/.m2/repository
这个本地库目录下寻找所需的依赖,如果没有会去远程的库上寻找,并将其下载到本地库中,默认的远程库地址为 http://repo.maven.apache.org/maven2/
。
包的发布
当需要发布一个包的远程仓库时,需要配置库的地址和相应的权限,一个范例如下:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
<build>
<filters>
<filter>src/main/filters/filters.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!--
|
|
|
-->
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
</project>
它所需要的权限配置在settings.xml
中:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
...
</settings>
多Modules管理
Maven很好的支持了多个Modules的管理,假如一个Maven项目结构如下:
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
对于根目录下的pom文件,内容如下:
<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.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
其中的<modules>
定义了其管理的两个子modules。
假如my-webapp需要依赖my-app包,那么在my-webapp/pom.xml
中增加:
...
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
然后在my-app和my-webapp的pom文件中都增加parent配置:
<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">
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...
然后在最顶层目录下执行mvn clean install
,会创建my-webapp/target/my-webapp.war
,其中包含:
$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
0 Fri Jun 24 10:59:56 EST 2005 META-INF/
222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/
3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/
215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml
123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties
52 Fri Jun 24 10:59:56 EST 2005 index.jsp
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/
2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar
可见my-app-1.0-SNAPSHOT.jar
已经被放到了WEB-INF/lib
目录下。