龙岗企业网站制作公司,wordpress 百度收录,北京网站sem、seo,女性玩具广告200元我一直忙于在工作中使用Maven的腋窝。 对于很多开发人员#xff0c;我会听到#xff1a;“那又怎样。” 不同之处在于#xff0c;我通常在无法直接访问Internet的环境中工作。 因此#xff0c;当我说我经常使用Maven时#xff0c;这意味着某些事情。 依赖地狱 公平地说我会听到“那又怎样。” 不同之处在于我通常在无法直接访问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。 令人遗憾的是我将显示的示例只有一个mojo但是该示例还将显示测试插件的最佳实践。 最佳做法是唯一允许的做法 看看我在标题中与Dojo交易相关的工作吗 如果有兴趣编写插件涉及命名约定单元测试和集成测试。 命名约定是最重要的 您不会破坏Apache商标 其他人知道一个人做了一个插件。 名称中有什么 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需要提醒我所做的一切。 我曾想创建一个洗狗提醒插件但是我决定使用一个普通的提醒插件因为这样我就可以用它提醒我需要做的任何事情。 Pom文件 project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.darylmathison/groupIdartifactIdreminder-maven-plugin/artifactIdpackagingmaven-plugin/packagingversion1.0-SNAPSHOT/versionnamereminder-maven-plugin Maven Mojo/nameurlhttp://maven.apache.org/urlpropertiesmavenVersion3.2.1/mavenVersionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/propertiesdependencies!-- Maven dependencies --dependencygroupIdorg.apache.maven/groupIdartifactIdmaven-plugin-api/artifactIdversion${mavenVersion}/version/dependencydependencygroupIdorg.apache.maven/groupIdartifactIdmaven-core/artifactIdversion${mavenVersion}/version/dependencydependencygroupIdorg.apache.maven.plugin-tools/groupIdartifactIdmaven-plugin-annotations/artifactIdversion3.2/versionscopeprovided/scope/dependencydependencygroupIdorg.apache.maven/groupIdartifactIdmaven-compat/artifactIdversion3.2.1/versionscopetest/scope/dependencydependencygroupIdorg.apache.maven.plugin-testing/groupIdartifactIdmaven-plugin-testing-harness/artifactIdversion3.1.0/versionscopetest/scope/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency/dependenciesbuildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationsource1.8/sourcetarget1.8/target/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-plugin-plugin/artifactIdversion3.2/versionexecutionsexecutionidmojo-descriptor/idgoalsgoaldescriptor/goal/goals/execution/executionsconfigurationskipErrorNoDescriptorsFoundtrue/skipErrorNoDescriptorsFound/configuration/plugin/plugins/pluginManagement/buildprofilesprofileidrun-its/idbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-invoker-plugin/artifactIdversion1.7/versionconfigurationdebugtrue/debugcloneProjectsTo${project.build.directory}/it/cloneProjectsTocloneCleantrue/cloneCleanpomIncludespomInclude*/pom.xml/pomInclude/pomIncludesaddTestClassPathtrue/addTestClassPathpostBuildHookScriptverify/postBuildHookScriptlocalRepositoryPath${project.build.directory}/local-repo/localRepositoryPathsettingsFilesrc/it/settings.xml/settingsFilegoalsgoalclean/goalgoalcompile/goalgoalpackage/goal/goals/configurationexecutionsexecutionidintegration-test/idgoalsgoalinstall/goalgoalrun/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 xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.darylmathison.test/groupIdartifactIdreminder-maven-plugin-test-reminder/artifactIdpackagingjar/packagingversion1.0-SNAPSHOT/versionnamereminder-maven-plugin Maven Mojo/namedependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdcom.darylmathison/groupIdartifactIdreminder-maven-plugin/artifactIdversion1.0-SNAPSHOT/versionconfigurationbasedirtarget/test-classes/unit/reminder-mojo/basedirmessageWash the doggies/message/configuration/plugin/plugins/build
/project 只是定义插件的主pom文件的迷你版本。 整合测试 这是值得的因为它实际上是Maven项目中的一个单独的Maven项目。 本练习的主要重点是查看插件将执行的操作而不是其他操作。 示例应用程序很简单就可以在其中构建Maven项目。 要注意的另一件事是pom文件使用一些过滤来匹配groupIdartifactId和主插件pom的版本。 Pom文件 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.darylmathison.it/groupIdartifactIdnew-timestamp/artifactIdversion0.0.1.BUILD-SNAPSHOT/versionpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesbuildpluginsplugingroupIdproject.groupId/groupIdartifactIdproject.artifactId/artifactIdversionproject.version/versionexecutionsexecutionidblah/idgoalsgoalremind/goal/goals/execution/executionsconfigurationmessageWash the doggies/message/configuration/plugin/plugins/build
/projectSampleApp 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 Spring靴 翻译自: https://www.javacodegeeks.com/2015/04/there-is-a-mojo-in-my-dojo-how-to-write-a-maven-plugin.html