java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...
java ee maven
為什么呢
很多時候,我在日常工作中試圖解決一些基本或復雜的Maven / Java EE項目結構問題。 為了提供解決方案,我經常最終會嘗試項目結構,測試我在不同應用程序服務器上的部署并細化我的配置。
Maven對于新來者來說可能會有陡峭的學習曲線,如果您將現代Java EE應用程序的“ 有時 ”復雜的配置要求添加進來,事情會變得更加令人沮喪。 在我的職業生涯中,我還看到很多初級Java開發人員 ,當他們加入一個大團隊或一個項目時,大多數時候,項目結構已經由高級成員細化和配置。 他們認為這是可行的,并且沒有花費時間來了解接線和配置。 我過去自己犯過這個錯誤。 他們被分配了簡單的編碼任務并且對需求進行了深入研究,但是不幸的是他們忘記了研究應用程序結構,而他們的高級同事也常常由于時間限制而忘記在特定領域進行培訓。 當人們在沒有經驗的情況下開始嘗試弄亂應用程序的結構而試圖使其正常工作時,可能會導致事故。 Maven及其約定旨在為建立項目的結構和結構提供很多幫助,但是您仍然需要了解工具的約定,然后精通“ 配置 ”。
您經常會聽到有人說“ 我在這里添加了這個庫,它起作用了 ”,如果您回復“在那定義 ”,那么您可能會得到一些有趣的答案。 有時是偶然或幸運的,它起作用了,但是在復雜的多模塊應用程序中,大多數情況下“ 它只是起作用 ”是一種輕描淡寫,問題很快就會開始出現。
本系列文章主要針對Maven和Java EE新手 ,但如果您是高級開發人員,可以隨時分享或用作演示。 我將在演示的基礎上“攻擊”我在日常工作中發現的一些實際問題,并嘗試在提供基本解釋或相關資源鏈接的同時提供解決方案。 請歡迎為可以以更簡潔的方式執行/完成的操作添加評論,更正或參考。 學習Maven并創建“復雜”但易于維護的應用程序的最佳方法是從頭開始創建空的pom文件。
我要傳達給初級開發人員閱讀我的文章的主要信息是, “ 研究”您的應用程序結構,詢問底層構建工具是您工作的一部分,并且您永遠不應以為其他方法總是會照顧您它 。 這也是挑戰更艱巨的任務并提高您作為Java開發人員的技能的一步。
使用的核心技術
- 基于Java EE 7的應用程序
- 將包裝為EAR
- 將具有多個組件(wars,jars,ejb jars)
- 將針對Java 7進行編譯
- 將使用Maven 3打包
我的演示耳應用
我的應用程序將是EAR ,對于這個特定的職位,該耳朵將包括2個頂級模塊war和ejb-jar。 還有一個jar,其中將包含將成為我的數據庫域模型(JPA實體)的類。 我將擴展結構,在以后的帖子中添加更多資源。 一個非常抽象的圖像,僅用于提供一個想法,說明將“包含在我們的耳朵中”的內容。 將來的war模塊將包含servlet或jsf組件,services模塊將包含一組常見的無狀態Sesson Bean(或消息驅動的Bean)。 域項目將具有用JPA 2構造正確注釋的普通Java類。
使用Maven構成我們應用程序的基本結構
為了讓您耳目一新,我們需要使用Maven來定義模塊和應用程序的各個部分,而Maven仍然是我們的構建/打包/配置工具。 這是最重要的步驟之一,如果您從一開始就掌握了這一步驟,那么其余的將只是簡單的技術或特定的配置。 我要提出的并不是最終的解決方案,而是與標準非常接近的標準,這在大多數情況下是啟動新應用程序的“ 路要走 ”,因此在這里沒有有趣的細節,讓我們遵循標準并開始在混凝土基礎。
因此,讓我們現在忘記上面的圖片,讓我們考慮一下Maven,可以定義哪些模塊和多少模塊,如何互連它們以及定義依賴項。 注意,我建議的工作方式是標準的,但不是最終的解決方案,這意味著您可以通過將應用程序打包成耳朵,定義更少的模塊和依賴項來獲得相同的結果。 假設我想涵蓋高度復雜的結構,那么我將始終遵循標準來定義通用結構。
我假設您已經涵蓋了Maven的一些基本知識,并且至少熟悉該術語。 如果沒有在這里看看。
請記住,Maven即將按照正確定義的結構將文件放置在正確的位置,并定義maven插件,maven插件是用于完成特定工作的某種工具,包括編譯,打包,復制文件等。 Maven,所以再次需要將插件定義到正確的位置并使用適當的配置。 您不是在編寫make或ant腳本,而只是“插入”插件并要求Maven以明確定義的順序執行它們。
作為我的好前同事(最近寫了一封電子郵件), 打破生活和編碼慣例是件好事,但絕不能使用Maven 。 他是對的!
如果不確定如何安裝Maven,請在此處查看Windows或Mac
我的Maven項目結構–摘要
我們正在使用Maven進行構建,因此我們需要考慮Maven Pom和模塊。 為了制作出所需的耳朵包裝(見上文),我們需要5 poms
- pom – 充當父母
- 包含/定義最終耳朵的pom –負責配置最終程序包。
- 一個包含/定義Web應用程序代碼的pom,即我們的.war
- 一個pom,它將包含/定義ejb-module的代碼,ejb-module是我們要打包EJB的模塊
- 一個pom,它將包含將成為我們的JPA(數據庫實體)的類
如您所見,每個模塊都有自己的pom,并且有父級,由于項目很小,假設他們不需要它,那么很多人都不會在其結構中添加東西。過了一會兒,當添加更多的模塊時,您最終會陷入混亂。 因此,在此處記下“ parent pom真的很不錯,可以進行配置 ”。 這是pom,您可以在其中定義所有依賴項版本(即庫)并配置maven插件,以便所有子pom都繼承通用配置。
我的Maven項目結構–父pom
正如我已經詳細說明的那樣,我們將從頭開始,因此我將創建一個名為“ 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被稱為parent,因為它“定義”并管理子模塊,這是在模塊定義部分完成的。 我們原來的pom變成了這樣的樣子。 這意味著我們必須在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><modules><module>sample-ear</module><module>sample-web</module><module>sample-services</module><module>sample-domain</module></modules></project>讓我們繼續添加更多配置...
這是重要的部分,因為我們為
- 我們將要使用和配置的Maven插件
- 任何庫–使用的依賴項以及其他模塊的引用
- 其他通用屬性,例如我們將要編譯的Java運行時的版本
- 源文件或其他資產的默認編碼。
讓我們在屬性部分之后添加另一個重要的部分,即dependencyManagement 。在這里,我們將定義可以在我們的應用程序模塊中潛在使用的依賴關系及其版本。 在本節中,我們實際上關心版本,依賴項的包含或排除取決于子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 ,這是我們將在應用程序配置和打包期間定義和參考的所有maven插件的版本和通用配置的部分。在下面的示例中,我定義了最基本的編譯器插件之一,但是我當然需要更多!
<!-- 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>那是現在
您可以在此處下載我們的最小樣本(標記post1,bitbucket)。 當時,我們似乎還沒有完成任何工作,但是最終定義一個干凈而具體的父pom將成為我們在后續職位中要做的其余工作的基礎。
學習要點
- Maven標準布局
- 父pom
- DependencyManagement和pluginManagement的重要性
資源資源
- Maven3
- Java EE 7教程
- Maven項目結構
- 父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
java ee maven
總結
以上是生活随笔為你收集整理的java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 1 2重定向(linux 1
- 下一篇: 安卓mht文件查看器(安卓mht)