针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom
為什么呢
很多時候,我在日常工作中試圖解決一些基本或復(fù)雜的Maven / Java EE項目結(jié)構(gòu)問題。 為了提供解決方案,我經(jīng)常最終會嘗試項目結(jié)構(gòu),測試我在不同應(yīng)用程序服務(wù)器上的部署并細(xì)化我的配置。
Maven對于新來者來說可能會有陡峭的學(xué)習(xí)曲線,如果您將現(xiàn)代Java EE應(yīng)用程序的“ 有時 ”復(fù)雜的配置要求添加進來,事情會變得更加令人沮喪。 在我的職業(yè)生涯中,我還看到很多初級Java開發(fā)人員 ,當(dāng)他們加入一個大團隊或一個項目時,大多數(shù)情況下,項目結(jié)構(gòu)已經(jīng)由高級成員細(xì)化并配置。 他們認(rèn)為這是可行的,并且沒有花費時間來了解接線和配置。 我過去自己犯過這個錯誤。 他們被分配了簡單的編碼任務(wù),并且深入研究了需求,但不幸的是,他們忘記了研究應(yīng)用程序的結(jié)構(gòu),而他們的高級同事也常常由于時間限制而忘記在此特定領(lǐng)域進行培訓(xùn)。 當(dāng)人們在沒有經(jīng)驗的情況下開始嘗試弄亂應(yīng)用程序的結(jié)構(gòu)而試圖使其正常工作時,可能會導(dǎo)致事故。 Maven及其約定旨在為建立通用的結(jié)構(gòu)和約定提供有關(guān)項目結(jié)構(gòu)的幫助,但是您再次需要了解工具的約定,然后掌握您的“ 配置 ”。
您經(jīng)常會聽到有人說“ 我在這里添加了這個庫,它起作用了 ”,如果您回復(fù)“在那定義 ”,那么您可能會得到一些有趣的答案。 有時偶然或偶然的情況下它會起作用,但是在復(fù)雜的多模塊應(yīng)用程序中,大多數(shù)情況下“ 它只是起作用 ”被輕描淡寫,問題很快就會開始出現(xiàn)。
本系列文章主要針對Maven和Java EE新手 ,但如果您是高級開發(fā)人員,可以隨時分享或用作演示。 我將在演示的基礎(chǔ)上“攻擊”我在日常工作中發(fā)現(xiàn)的一些實際問題,并嘗試在提供基本解釋或相關(guān)資源鏈接的同時提供解決方案。 請歡迎為可以以更簡潔的方式執(zhí)行/完成的操作添加評論,更正或參考。 學(xué)習(xí)Maven并創(chuàng)建“復(fù)雜”但易于維護的應(yīng)用程序的最佳方法是從頭開始創(chuàng)建空的pom文件。
我要傳達(dá)給初級開發(fā)人員閱讀我的文章的主要信息是, “ 研究”您的應(yīng)用程序結(jié)構(gòu),詢問底層的構(gòu)建工具是您工作的一部分,并且您永遠(yuǎn)不要以為其他方法總是會照顧您它 。 這也是挑戰(zhàn)更艱巨的任務(wù)并提高您作為Java開發(fā)人員的技能的一步。
使用的核心技術(shù)
- 基于Java EE 7的應(yīng)用程序
- 將包裝為EAR
- 將具有多個組件(wars,jars,ejb jars)
- 將針對Java 7進行編譯
- 將使用Maven 3打包
我的演示耳應(yīng)用
我的應(yīng)用程序?qū)⑹荅AR ,對于這個特定的職位,該耳朵將包括2個頂級模塊war和ejb-jar。 也將有一個jar,其中將包含將成為我的數(shù)據(jù)庫域模型(JPA實體)的類。 我將擴展結(jié)構(gòu),在以后的帖子中添加更多資源。 一個非常抽象的圖像,僅用于提供一個想法,說明將“包含在我們的耳朵中”。 未來的war模塊將包含servlet或jsf組件,services模塊將包含一組常見的無狀態(tài)Sesson Bean(或消息驅(qū)動的Bean)。 域項目將具有用JPA 2構(gòu)造正確注釋的普通Java類。
使用Maven構(gòu)成我們應(yīng)用程序的基本結(jié)構(gòu)
為了讓您耳目一新,我們需要使用Maven來定義模塊和應(yīng)用程序的各個部分,而Maven仍然是我們的構(gòu)建/打包/配置工具。 這是最重要的步驟之一,如果您從一開始就掌握了這一步驟,那么其余的將只是簡單的技術(shù)或配置細(xì)節(jié)。 我要提出的并不是最終的解決方案,而是與標(biāo)準(zhǔn)非常接近的標(biāo)準(zhǔn),這在大多數(shù)情況下是啟動新應(yīng)用程序的“ 路要走 ”,因此在這里沒有有趣的細(xì)節(jié),讓我們遵循標(biāo)準(zhǔn)并開始構(gòu)建新的應(yīng)用程序。具體的基礎(chǔ)。
因此,讓我們現(xiàn)在忘記上面的圖片,讓我們考慮一下Maven,可以定義什么模塊和多少模塊,如何互連它們以及定義依賴項。 注意,我建議的工作方式是標(biāo)準(zhǔn)的,但不是最終的解決方案,這意味著您可以通過將應(yīng)用程序包裝成耳朵,定義更少的模塊和依賴項來獲得相同的結(jié)果。 假設(shè)我想涵蓋高度復(fù)雜的結(jié)構(gòu),那么我將始終遵循標(biāo)準(zhǔn)來定義通用結(jié)構(gòu)。
我假設(shè)您已經(jīng)涵蓋了Maven的一些基本知識,并且至少熟悉該術(shù)語。 如果沒有在這里看看。
請記住,Maven即將按照正確定義的結(jié)構(gòu)將文件放置在正確的位置,并定義maven插件,maven插件是用于完成特定工作的某種工具,包括編譯,打包,復(fù)制文件等。 Maven,所以再次需要將插件定義到正確的位置并使用適當(dāng)?shù)呐渲谩?您不是在編寫make或ant腳本,而只是“插入”插件并要求maven以明確定義的順序執(zhí)行它們。
作為我的好前同事(最近寫了一封電子郵件), 打破生活和編碼慣例是件好事,但絕不能使用Maven 。 他是對的!
如果不確定如何安裝Maven,請在此處查看Windows或Mac
我的Maven項目結(jié)構(gòu)–摘要
我們正在使用Maven進行構(gòu)建,因此我們需要考慮Maven pom和模塊。 為了制作出所需的耳朵包裝(見上文),我們需要5 poms
- pom – 充當(dāng)父母
- 包含/定義最終耳朵的pom –負(fù)責(zé)配置最終程序包。
- 一個包含/定義Web應(yīng)用程序代碼的pom,即我們的.war
- 一個pom,它將包含/定義ejb-module的代碼,ejb-module是我們將打包EJB的模塊
- 一個pom,它將包含將成為我們的JPA(數(shù)據(jù)庫實體)的類
如您所見,每個模塊都有自己的pom,并且有父級,由于項目很小,假設(shè)他們不需要它,那么很多人都不會在其結(jié)構(gòu)中添加其中之一。過了一會兒,當(dāng)添加更多模塊時,您最終將遭受重創(chuàng)。 因此,請在此處記下“ parent pom非常好擁有并配置 ”。 這是pom,您可以在其中定義所有依賴項版本(即庫)并配置maven插件,以便所有子pom都繼承通用配置。
我的Maven項目結(jié)構(gòu)-父pom
正如我已經(jīng)詳細(xì)說明的那樣,我們將從頭開始,因此我將創(chuàng)建一個名為“ sample-parent ”的新文件夾,并在該文件夾中添加一個名為“ pom.xml ”的新文件。
<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>gr.javapapo</groupId><artifactId>sample-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging></project>是的,不要激動,只需在定義“ pom ”的包裝元素上注明。父級稱為parent,因為它“定義”并管理子級模塊,這是在模塊定義部分完成的。 我們原來的pom變成了這樣。 這意味著我們必須在sample-parent下創(chuàng)建相關(guān)文件夾,然后將pom.xml添加到每個文件夾中。
<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>gr.javapapo</groupId><artifactId>sample-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><modules><module>sample-ear</module><module>sample-web</module><module>sample-services</module><module>sample-domain</module></modules></project>讓我們繼續(xù)添加更多配置...
這是重要的部分,因為我們?yōu)?
- 我們將要使用和配置的Maven插件
- 任何庫–使用的依賴項以及其他模塊的引用
- 其他通用屬性,例如我們將要編譯的Java運行時的版本
- 源文件或其他資產(chǎn)的默認(rèn)編碼。
讓我們在屬性部分之后添加另一個重要的部分,即dependencyManagement 。在這里,我們將定義可以在我們的應(yīng)用程序模塊中潛在使用的依賴關(guān)系及其版本。 在本節(jié)中,我們實際上關(guān)心版本,依賴項的包含或排除取決于子pom(這意味著它們不會自動添加)以及它們的范圍。 因此, DependencyManagement部分是要控制的部分,版本集中在一處。
<dependencyManagement><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>${javaee-api-version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit-version}</version></dependency></dependencies></dependencyManagement>父pom中的另一個最后但重要的部分與dependencyManagemt相似,稱為pluginManagement ,是我們將在其中定義,將在我們的應(yīng)用程序配置和打包期間參考和使用的所有maven插件的版本和通用配置的部分。在下面的示例中,我定義了最基本的編譯器插件之一,但是我當(dāng)然需要更多!
<!-- Plugin management --><build><pluginManagement><plugins><!-- compiler plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${compiler-plugin-version}</version><configuration><source>${java-version}</source><target>${java-version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></pluginManagement></build>讓我們添加并配置一些稍后將要使用的插件。在“插件管理”部分中添加它們。 我們定義了將要編譯并打包我們的ejb的ejb插件以及將要打包我們的war的war插件。
<!-- ejb plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-ejb-plugin</artifactId><version>${ejb-plugin-version}</version><configuration><ejbVersion>${ejb-spec-version}</ejbVersion></configuration></plugin><!-- war plugin -skinny wars mode! --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>${war-plugin-version}</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml><packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive><webResources><resource><filtering>true</filtering><directory>src/main/webapp</directory><includes><include>**/web.xml</include></includes></resource></webResources></configuration></plugin>那是現(xiàn)在
您可以在此處下載我們的最小樣本(標(biāo)記post1,bitbucket)。 當(dāng)時,我們似乎還沒有完成任何工作,但是最終定義一個干凈而具體的父pom將成為我們在即將發(fā)布的帖子中將要進行的其余工作的基礎(chǔ)。
學(xué)習(xí)要點
- Maven標(biāo)準(zhǔn)布局
- 父pom
- DependencyManagement和pluginManagement的重要性
資源資源
- Maven3
- Java EE 7教程
- Maven項目結(jié)構(gòu)
- 父pom
- 什么是依賴管理?
- 什么是插件管理?
- 您可以在此處下載以上代碼。
翻譯自: https://www.javacodegeeks.com/2014/04/java-ee7-and-maven-project-for-newbies-part-1-a-simple-maven-project-structure-the-parent-pom.html
總結(jié)
以上是生活随笔為你收集整理的针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧盟委员会公布首批 6 家《数字市场法案
- 下一篇: 如何与Java 8,NetBeans P