dojo还有人用吗_我的Dojo中有一个Mojo(如何编写Maven插件)
dojo還有人用嗎
我一直忙于在工作中使用Maven的腋窩。 對于很多開發人員,我會聽到:“那又怎樣。” 區別在于,我通常在無法直接訪問Internet的環境中工作。 因此,當我說我經常使用Maven時,這意味著某些事情。
依賴地獄
公平地說,我在示例中一直在隨意使用Maven。 我發現下載依賴項并避免“依賴地獄”更為方便。 我必須為正在使用的庫下載庫的情況。 例如,必須下載Hamcrest才能使用JUnit。 在家里,放入對JUnit的依賴關系,而Maven為我下載Hamcrest,因為它是JUnit的依賴關系。 如果存在Hamcrest的依賴關系,Maven也會下載該依賴關系。 在工作時,我需要研究JUnit具有哪些依賴關系,然后研究這些依賴關系具有哪些依賴關系。 由于這種情況,我避免使用庫。
形勢變化
更改是因為我在工作中使用Spring Roo。 Roo使用Maven來管理它需要合并的Spring依賴項。 由于此更改,我在開發網絡上設置了Nexus服務器,并開始了將依賴項從Internet轉移到開發網絡的過程。 這使我了解了Maven。
我對Maven的了解
在閱讀了《 Maven入門》和《 Maven Build Customization》兩本書之后,我對Maven以及如何創建本文的主題有了一個很好的了解。 我可以繼續學習我所學到的東西,但是我會將其重點放在學習Maven插件所需的知識上。 我確實假設一個人看到了一個pom文件并從現在開始運行了一些Maven構建。 如果還沒有,請購買我讀過的書,或者先去http://maven.apache.org 。
Maven插件豐富
Maven基于插件架構。 在Maven中執行任何操作的都是插件。 從諸如編譯之類的核心功能到創建網站。 可以想象,每個插件都有某些共同點。
Maven是面向包,生命周期,階段和目標的
Maven以將某種內容構建到某種打包項目(例如jar文件)中而聞名。 顯而易見,這是pom文件的第一行。 可能不知道的是,有一系列“階段”或“生命周期”恰巧完成了構建程序包的過程(請參閱我在其中所做的事情)。 實際上,這些階段之一被稱為“打包”。 生命周期中的默認階段列表如下:
Maven構建中正在進行很多工作! 所有這些都由某種插件運行。 每個插件都是由可以設置為在生命周期的特定階段運行的目標組成的。 例如,將maven-jar-plugin的jar目標設置為在打包階段運行。
制作插件
既然已經對構建過程進行了更深入的了解,是時候解釋創建Maven插件所需的內容了。
插件充滿了Mojos
什么是魔力? Mojo是Maven普通的Old Java Objects的縮寫。 它是Maven識別的插件的最小單位。 所有插件均由mojos制成。 每個mojo與一個目標相關聯。 因此,要使一個插件具有多個目標,就需要多個mojo。 可悲的是,我將僅顯示一個示例,但是該示例還將顯示測試插件的最佳實踐。
最佳實踐是唯一允許的實踐
看看我在標題中與Dojo交易相關的工作嗎? 如果有興趣,編寫插件涉及命名約定,單元測試和集成測試。 命名約定是最重要的
名稱是什么?
Apache插件的命名約定為maven- <title> -plugin。 例如,jar插件名為maven-jar-plugin。 對于其他所有人,命名約定為<title> -maven-plugin。 例如,我創建的示例名為hinter-maven-plugin。 發表本文時使用的另一個示例是Spring Boot的插件,它名為spring-boot-maven-plugin。 Spring Boot的源代碼在這里 。 我分叉了它,所以我可以細讀和濫用代碼。 我的叉子可以在這里找到。 如果您想一起濫用它,請在完成您特定的濫用行為后,將我的副本分叉并發送給我請求請求。 無論如何,如果使用Apache的命名約定,那就是商標侵權。 你被警告了。
單元測試
自動化的單元和集成測試也很重要。 單元測試所遵循的目錄模式與普通單元測試略有不同,因此請耐心等待。
對插件進行單元測試時的目錄結構為
請注意,所有測試目錄都組織在測試目錄下。 一個正在制作的是將使用該插件的項目的一個小版本。 測試資源目錄下是一個單元目錄,其后是子目錄中的單元名稱。 目標是一次測試一個Mojo。 由于我的示例只有一個mojo,因此我僅設置了一個測試。 除了目錄設置以外,還有其他區別,但示例部分將進行介紹。
整合測試
我發現該測試將使您最大程度地了解一個人的特定插件及其工作方式。 目標是測試某種情況,就像它是實際項目構建的一部分一樣。 當我指的是實際項目構建時,我的意思是甚至有一個僅用于集成構建的臨時存儲庫。 在閱讀了有關如何設置測試的信息之后,我大量借鑒了spring-boot-maven-plugin的集成測試設置和mini pom文件。 好的,我將一些文件復制到示例代碼中。 只是通知一個人Spring Boot做得對。 只是為了安全起見,一個克隆只讀文件或派生他們的代碼才是安全的。 目錄結構如下所示。
集成測試不在test目錄下,而是位于it目錄中src目錄下。 我本可以做更多的集成測試,但到目前為止已經足夠了。
例
該示例插件的靈感來自于我心不在and,需要提醒我所做的一切。 我曾想創建一個“洗狗提醒” Maven插件,但是我決定使用一個簡單的“提醒” 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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.darylmathison</groupId><artifactId>reminder-maven-plugin</artifactId><packaging>maven-plugin</packaging><version>1.0-SNAPSHOT</version><name>reminder-maven-plugin Maven Mojo</name><url>http://maven.apache.org</url><properties><mavenVersion>3.2.1</mavenVersion><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- Maven dependencies --><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>${mavenVersion}</version></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-core</artifactId><version>${mavenVersion}</version></dependency><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.2</version><scope>provided</scope></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-compat</artifactId><version>3.2.1</version><scope>test</scope></dependency><dependency><groupId>org.apache.maven.plugin-testing</groupId><artifactId>maven-plugin-testing-harness</artifactId><version>3.1.0</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>3.2</version><executions><execution><id>mojo-descriptor</id><goals><goal>descriptor</goal></goals></execution></executions><configuration><skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound></configuration></plugin></plugins></pluginManagement></build><profiles><profile><id>run-its</id><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-invoker-plugin</artifactId><version>1.7</version><configuration><debug>true</debug><cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo><cloneClean>true</cloneClean><pomIncludes><pomInclude>*/pom.xml</pomInclude></pomIncludes><addTestClassPath>true</addTestClassPath><postBuildHookScript>verify</postBuildHookScript><localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath><settingsFile>src/it/settings.xml</settingsFile><goals><goal>clean</goal><goal>compile</goal><goal>package</goal></goals></configuration><executions><execution><id>integration-test</id><goals><goal>install</goal><goal>run</goal></goals></execution></executions></plugin></plugins></build></profile></profiles> </project>如人們所見,構建一個插件需要很多插件和依賴項。 這里有一個注釋依賴項。 這是Junit的版本。 該版本必須為3.8.1。 這是因為Maven擴展了TestCase類,以使其更易于進行單元測試。 很快就會看到。 需要注意兩個插件,一個是maven-plugin-plugin,另一個是maven-invoker-plugin。 maven-plugin-plugin可以自動為一個插件創建幫助目標。 maven-invoker-plugin用于集成測試。 它的功能是運行Maven項目,如果一個人正在測試pom中運行它就很方便。
提醒Mojo.java
package com.darylmathison;import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter;import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;@Mojo(name = "remind",defaultPhase = LifecyclePhase.PACKAGE,requiresOnline = false, requiresProject = true,threadSafe = false) public class ReminderMojo extends AbstractMojo {@Parameter(property = "basedir", required = true)protected File basedir;@Parameter(property = "message", required = true)protected String message;@Parameter(property = "numOfWeeks", defaultValue = "6", required = true)protected int numOfWeeks;public void execute() throws MojoExecutionException {File timestampFile = new File(basedir, "timestamp.txt");getLog().debug("basedir is " + basedir.getName());if(!timestampFile.exists()) {basedir.mkdirs();getLog().info(message);timestamp(timestampFile);} else {LocalDateTime date = readTimestamp(timestampFile);date.plus(numOfWeeks, ChronoUnit.WEEKS);if(date.isBefore(LocalDateTime.now())) {getLog().info(message);timestamp(timestampFile);}}}private void timestamp(File file) throws MojoExecutionException {try(FileWriter w = new FileWriter(file)) {LocalDateTime localDateTime = LocalDateTime.now();w.write(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));} catch (IOException e) {throw new MojoExecutionException("Error creating file " + file, e);}}private LocalDateTime readTimestamp(File file) throws MojoExecutionException {try(FileReader r = new FileReader(file)) {char[] buffer = new char[1024];int len = r.read(buffer);LocalDateTime date = LocalDateTime.parse(String.valueOf(buffer, 0, len));return date;} catch(IOException ioe) {throw new MojoExecutionException("Error reading file " + file, ioe);}} }這是插件中唯一的Mojo,并且可以找到,它非常簡單,但是顯示了Mojo api提供的一些很酷的功能。 類注釋定義目標的名稱為“ remind”,并且它不是線程安全的。 它還定義了默認階段為打包階段。 我要提到的最后一件事是任何成員變量都可以成為參數。 這成為目標插件的參數。
提醒MojoTest
package com.darylmathison;import org.apache.maven.plugin.testing.AbstractMojoTestCase;import java.io.File;/*** Created by Daryl on 3/31/2015.*/ public class ReminderMojoTest extends AbstractMojoTestCase {@Overrideprotected void setUp() throws Exception {super.setUp();}@Overrideprotected void tearDown() throws Exception {super.tearDown();}public void testJustMessage() throws Exception {File pom = getTestFile("src/test/resources/unit/reminder-mojo/pom.xml");assertNotNull(pom);assertTrue(pom.exists());ReminderMojo myMojo = (ReminderMojo) lookupMojo("remind", pom);assertNotNull(myMojo);myMojo.execute();} }這是mojo的基本單元測試用例。 測試類擴展AbstractMojoTestCase以獲得一些功能,如getTestFile和lookupMojo。 以下是測試pom文件。
單元測試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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.darylmathison.test</groupId><artifactId>reminder-maven-plugin-test-reminder</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>reminder-maven-plugin Maven Mojo</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>com.darylmathison</groupId><artifactId>reminder-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><configuration><basedir>target/test-classes/unit/reminder-mojo</basedir><message>Wash the doggies</message></configuration></plugin></plugins></build> </project>只是定義插件的主pom文件的迷你版本。
整合測試
這是值得的,因為它實際上是Maven項目中的一個單獨的Maven項目。 本練習的主要重點是查看插件將執行的操作,而不是其他操作。 該示例應用程序很簡單,就可以在其中構建Maven項目。 要注意的另一件事是pom文件使用一些過濾來匹配groupId,artifactId和主插件pom的版本。
Pom文件
<?xml version="1.0" encoding="UTF-8"?> <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.darylmathison.it</groupId><artifactId>new-timestamp</artifactId><version>0.0.1.BUILD-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><build><plugins><plugin><groupId>@project.groupId@</groupId><artifactId>@project.artifactId@</artifactId><version>@project.version@</version><executions><execution><id>blah</id><goals><goal>remind</goal></goals></execution></executions><configuration><message>Wash the doggies</message></configuration></plugin></plugins></build> </project>SampleApp
package java.test;/*** Created by Daryl on 4/5/2015.*/ public class SampleApp {public static void Main(String[] args) {System.out.println("out");} }驗證
System.out.println(basedir); def file = new File(basedir, "timestamp.txt"); return file.exists();驗證腳本是為了確保插件能夠完成其預期的工作。 它只是檢查timestamp.txt文件是否存在,因為該插件在找不到時間戳文件時會創建一個。 Maven檢查驗證腳本的輸出是對還是錯。
結論
哇! 我在這篇文章中介紹了很多內容。 我去舉了一個如何創建一個Maven插件的例子。 我還展示了如何使用最佳實踐來測試該插件。 我得到了兩本書之間的信息,以及一個正在進行的開源項目的實例。 示例代碼在GitHub上托管這里 。 這是我的新示例主頁中的第一個示例。
參考資料
- 介紹Maven
- Maven構建定制
- http://maven.apache.org
- Sprint Boot
翻譯自: https://www.javacodegeeks.com/2015/04/there-is-a-mojo-in-my-dojo-how-to-write-a-maven-plugin.html
dojo還有人用嗎
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的dojo还有人用吗_我的Dojo中有一个Mojo(如何编写Maven插件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓台球游戏(安卓台球)
- 下一篇: linux激活网卡(linux 激活)