[maven] 实现使用 plugin 及 properties 简述

[maven] 实现&使用 plugin 及 properties 简述

这章内容,我个人感觉可看可不看……?

不过课都上了,笔记 📒 补完才对得起自己嘛

plugins

主要讲一下 maven 的 plugin 时怎么实现的,以及项目中怎么调用自己实现的 maven plugin

一般来说这个功能的确比较少用到,大多数情况下市场上已有的 plugin 是可以满足大部分需求了

新建项目

这次新建的是 plugin 项目,需要注意:

在这里插入图片描述

注意 POM 里的 packaging 类型为 maven-plugin

<?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.ga</groupId><artifactId>plugindemo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>maven-plugin</packaging><dependencies><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>${maven-plugin-api.version}</version></dependency><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>${maven-plugin-annotations.version}</version><scope>provided</scope></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-project</artifactId><version>${maven-project.version}</version></dependency></dependencies><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>${maven-plugin-plugin.version}</version></plugin></plugins></pluginManagement></build><properties><maven-plugin-api.version>3.6.2</maven-plugin-api.version><maven-plugin-annotations.version>3.6.0</maven-plugin-annotations.version><maven-project.version>2.2.1</maven-project.version><maven-plugin-plugin.version>3.6.4</maven-plugin-plugin.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><java.version>17</java.version></properties></project>

这个是只要会用到的配置,和 eclipse 内置的 pom 比起来少了很多的内容,如 test 相关的配置全都被移除了,这里只留下需要实现 plugin 的核心模块

Java 中默认的 MOJO 如下:

/*** Goal which touches a timestamp file.*/
@Mojo(name = "touch", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {/*** Location of the file.*/@Parameter(defaultValue = "${project.build.directory}", property = "outputDir", required = true)private File outputDirectory;public void execute() throws MojoExecutionException {}
}

就像 POJO 代表 Plain Old Java Object,MOJO 代表的就是 Maven plain Old Java Object

可以看到实现一个 MOJO 需要 extends AbstractMojo,而里面最重要的 execute 在执行出问题的时候抛出的是 MojoExecutionException

实现 MOJO 代码

其实主要就是调用 getLog() 在命令行进行输出:

@Mojo(name = "info-renderer", defaultPhase = LifecyclePhase.COMPILE)
public class ProjectInfoMojo extends AbstractMojo {@Overridepublic void execute() throws MojoExecutionException, MojoFailureException {getLog().info("Mojos are cool");}
}

getLog() 是由 AbstractMojo 提供的一个方法,其本身会返回一个 Log 实例以供调用,比较常见的用法就是调用 instance 上的 info, debug, error 在命令行输出相应的信息

运行 plugin

plugin 执行的语法为: mvn groupId:artifactId:version:goal

❯ mvn com.ga:plugindemo:info-renderer
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/com/ga/plugindemo/maven-metadata.xml
[INFO]
[INFO] -------------------------< com.ga:plugindemo >--------------------------
[INFO] Building plugindemo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default-cli) @ plugindemo ---
[INFO] Mojos are cool
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.026 s
[INFO] Finished at: 2023-09-19T00:28:59-04:00
[INFO] ------------------------------------------------------------------------

缩写

缩写这块我是没有成功过,不过根据官方文档 Shortening the Command Line 上说,需要修改 .m2 下的 settings.xml,大概如下:

<pluginGroups><pluginGroup>sample.plugin</pluginGroup>
</pluginGroups>

接下来执行这条指令就好了:mvn projectinfo:info-renderer

相当于说把 groupId 配置到 pluginGroup 里了,不幸的是尽管在 com.ga 下面找到了自己的 plugin,但是还是没发成功运行缩写:

❯ tree ~/.m2/repository/com/ga
/Users/usr/.m2/repository/com/ga
├── maven-metadata-local.xml
├── plugindemo
│   ├── 0.0.1-SNAPSHOT
│   │   ├── _remote.repositories
│   │   ├── maven-metadata-local.xml
│   │   ├── plugindemo-0.0.1-SNAPSHOT.jar
│   │   └── plugindemo-0.0.1-SNAPSHOT.pom
│   ├── maven-metadata-local.xml
│   └── resolver-status.properties
└── resolver-status.properties3 directories, 8 files

这有可能跟之前 xml 里的 proxy 有关,不是很确定……

不过不影响在其他项目中调用,就没继续琢磨了

调用项目信息

主要通过 annotation 实现,如下面添加了对项目的 annotation:

@Mojo(name = "info-renderer", defaultPhase = LifecyclePhase.COMPILE)
public class ProjectInfoMojo extends AbstractMojo {@Parameter(defaultValue = "${project}", required = true, readonly = true)MavenProject project;@Overridepublic void execute() throws MojoExecutionException, MojoFailureException {getLog().info("Mojos are cool");getLog().info("Project Name: " + project.getName());getLog().info("Artifact Id: " + project.getArtifactId());}}

终端上就能获取项目名称、artifact id 之类的信息:

❯ mvn com.ga:plugindemo:info-renderer
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.ga:plugindemo >--------------------------
[INFO] Building plugindemo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default-cli) @ plugindemo ---
[INFO] Mojos are cool
[INFO] Project Name: plugindemo
[INFO] Artifact Id: plugindemo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.313 s
[INFO] Finished at: 2023-09-19T01:56:26-04:00
[INFO] ------------------------------------------------------------------------

在这里插入图片描述

访问依赖 dependencies

依赖也是保存在 project 里,这里使用了一个 lambda expression 遍历所有的依赖:

project.getDependencies().forEach(d -> getLog().info(d.toString()));

输出结果:

❯ mvn com.ga:plugindemo:info-renderer
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.ga:plugindemo >--------------------------
[INFO] Building plugindemo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default-cli) @ plugindemo ---
[INFO] Mojos are cool
[INFO] Project Name: plugindemo
[INFO] Artifact Id: plugindemo
[INFO] Dependency {groupId=org.apache.maven, artifactId=maven-plugin-api, version=3.6.2, type=jar}
[INFO] Dependency {groupId=org.apache.maven.plugin-tools, artifactId=maven-plugin-annotations, version=3.6.0, type=jar}
[INFO] Dependency {groupId=org.apache.maven, artifactId=maven-project, version=2.2.1, type=jar}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.321 s
[INFO] Finished at: 2023-09-19T01:58:10-04:00
[INFO] ------------------------------------------------------------------------

传入参数

从命令行/配置中获取参数的方法如下:

List<Dependency> dependencies = project.getDependencies();
dependencies.stream().filter(d -> scope != null && scope.equals(d.getScope())).forEach(d -> getLog().info(d.toString()));

上面这个代码会获取 scope 这个参数,并且过滤掉所有与传入的 scope 不相符的依赖:

❯ mvn com.ga:plugindemo:info-renderer -Dscope=test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.ga:plugindemo >--------------------------
[INFO] Building plugindemo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default-cli) @ plugindemo ---
[INFO] Mojos are cool
[INFO] Project Name: plugindemo
[INFO] Artifact Id: plugindemo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.365 s
[INFO] Finished at: 2023-09-19T02:03:30-04:00
[INFO] ------------------------------------------------------------------------

上面我已经提到过,所有和测试相关的 pom 都移除了,这里自然不会看到跟测试有关的 pom。而 scope 为 provided 的有一个 org.apache.maven.plugin-tools,所以就会在下面显示出来:

# change scope to provided
❯ mvn com.ga:plugindemo:info-renderer -Dscope=provided
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.ga:plugindemo >--------------------------
[INFO] Building plugindemo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default-cli) @ plugindemo ---
[INFO] Mojos are cool
[INFO] Project Name: plugindemo
[INFO] Artifact Id: plugindemo
[INFO] Dependency {groupId=org.apache.maven.plugin-tools, artifactId=maven-plugin-annotations, version=3.6.0, type=jar}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.371 s
[INFO] Finished at: 2023-09-19T02:04:30-04:00
[INFO] ------------------------------------------------------------------------

在其他项目中使用 plugin

其实和调用其他的 plugin 一样,pom 如下:

	<build><plugins><plugin><groupId>com.ga</groupId><artifactId>plugindemo</artifactId><version>0.0.1-SNAPSHOT</version><executions><execution><goals><goal>info-renderer</goal></goals></execution></executions><configuration><scope>test</scope></configuration></plugin></plugins></build>

执行结果如下:

在这里插入图片描述

❯ mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.ga:use-plugin >--------------------------
[INFO] Building use-plugin 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ use-plugin ---
[INFO] Deleting /Users/usr/study/maven/use-plugin/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ use-plugin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/usr/study/maven/use-plugin/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ use-plugin ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/usr/study/maven/use-plugin/target/classes
[INFO]
[INFO] --- plugindemo:0.0.1-SNAPSHOT:info-renderer (default) @ use-plugin ---
[INFO] Mojos are cool
[INFO] Project Name: use-plugin
[INFO] Artifact Id: use-plugin
[INFO] Dependency {groupId=junit, artifactId=junit, version=4.11, type=jar}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.220 s
[INFO] Finished at: 2023-09-20T20:52:37-04:00
[INFO] ------------------------------------------------------------------------

在这里插入图片描述

properties

properties 这里……主要就是用到再查的感觉吧,常用的就是之前已经写过的,通过 properties 对使用的依赖进行版本管理的方法

这里用到的 maven-antrun-plugin 是打包用的插件

命令行输出所有属性

这里用的项目是之前 [maven] maven 创建 web 项目并嵌套项目 中实现的项目,POM 修改如下:

<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.7</version><executions><execution><phase>validate</phase><goals><goal>run</goal></goals><configuration><tasks><echoproperties /></tasks></configuration></execution></executions></plugin>
</plugins>

需要注意的是 echoproperties 这个属性在后来的版本被移除了,这里跟着教程使用 1.7 可以输出所有的属性:

main:
[echoproperties] #Ant properties
[echoproperties] #Wed Sep 20 21:02:03 EDT 2023
[echoproperties] java.specification.version=17
[echoproperties] ant.project.name=maven-antrun-
[echoproperties] sun.jnu.encoding=UTF-8
[echoproperties] project.build.testOutputDirectory=/Users/usr/study/maven/parent/productweb/target/test-classes
[echoproperties] project.name=productweb Maven Webapp
[echoproperties] settings.localRepository=/Users/usr/.m2/repository
[echoproperties] sun.arch.data.model=64
[echoproperties] java.vendor.url=https\://www.microsoft.com
[echoproperties] maven.dependency.org.springframework.spring-aop.jar.path=/Users/usr/.m2/repository/org/springframework/spring-aop/6.0.11/spring-aop-6.0.11.jar
[echoproperties] maven.dependency.org.springframework.spring-beans.jar.path=/Users/usr/.m2/repository/org/springframework/spring-beans/6.0.11/spring-beans-6.0.11.jar
[echoproperties] sun.boot.library.path=/Users/usr/.sdkman/candidates/java/17.0.8.1-ms/lib
[echoproperties] sun.java.command=org.codehaus.plexus.classworlds.launcher.Launcher validate
[echoproperties] jdk.debug=release
[echoproperties] maven.home=/Users/usr/.sdkman/candidates/maven/current
[echoproperties] sun.stderr.encoding=UTF-8
[echoproperties] java.specification.vendor=Oracle Corporation
[echoproperties] project.artifactId=productweb
[echoproperties] java.version.date=2023-08-24
[echoproperties] project.version=1.0
[echoproperties] java.home=/Users/usr/.sdkman/candidates/java/17.0.8.1-ms
[echoproperties] org.opentest4j\:opentest4j\:jar=/Users/usr/.m2/repository/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar
[echoproperties] basedir=/Users/usr/study/maven/parent/productweb
[echoproperties] file.separator=/
[echoproperties] java.vm.compressedOopsMode=Zero based
[echoproperties] project.packaging=war
[echoproperties] line.separator=\n
[echoproperties] org.junit.jupiter\:junit-jupiter-api\:jar=/Users/usr/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.10.0/junit-jupiter-api-5.10.0.jar
[echoproperties] sun.stdout.encoding=UTF-8
[echoproperties] java.specification.name=Java Platform API Specification
[echoproperties] java.vm.specification.vendor=Oracle Corporation
[echoproperties] org.junit.platform\:junit-platform-engine\:jar=/Users/usr/.m2/repository/org/junit/platform/junit-platform-engine/1.10.0/junit-platform-engine-1.10.0.jar
[echoproperties] org.springframework\:spring-beans\:jar=/Users/usr/.m2/repository/org/springframework/spring-beans/6.0.11/spring-beans-6.0.11.jar
[echoproperties] sun.management.compiler=HotSpot 64-Bit Tiered Compilers
[echoproperties] java.runtime.version=17.0.8.1+1-LTS
[echoproperties] maven.dependency.org.springframework.spring-expression.jar.path=/Users/usr/.m2/repository/org/springframework/spring-expression/6.0.11/spring-expression-6.0.11.jar
[echoproperties] user.name=usr
[echoproperties] org.junit.jupiter\:junit-jupiter-engine\:jar=/Users/usr/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.10.0/junit-jupiter-engine-5.10.0.jar
[echoproperties] file.encoding=UTF-8
[echoproperties] guice.disable.misplaced.annotation.check=true
[echoproperties] java.vendor.version=Microsoft-8297089
[echoproperties] localRepository=\      id\: local\n      url\: file\:///Users/usr/.m2/repository/\n   layout\: default\nsnapshots\: [enabled \=> true, update \=> always]\n releases\: [enabled \=> true, update \=> always]\n
[echoproperties] java.io.tmpdir=/var/folders/j_/r1vl8z45443b115dbx6pzvn80000gq/T/
[echoproperties] org.springframework\:spring-expression\:jar=/Users/usr/.m2/repository/org/springframework/spring-expression/6.0.11/spring-expression-6.0.11.jar
[echoproperties] java.version=17
[echoproperties] java.vm.specification.name=Java Virtual Machine Specification
[echoproperties] maven.dependency.org.junit.platform.junit-platform-commons.jar.path=/Users/usr/.m2/repository/org/junit/platform/junit-platform-commons/1.10.0/junit-platform-commons-1.10.0.jar
[echoproperties] org.springframework\:spring-aop\:jar=/Users/usr/.m2/repository/org/springframework/spring-aop/6.0.11/spring-aop-6.0.11.jar
[echoproperties] native.encoding=UTF-8
[echoproperties] ant.version=Apache Ant(TM) version 1.8.2 compiled on December 20 2010
[echoproperties] java.library.path=/Users/usr/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
[echoproperties] java.vendor=Microsoft
[echoproperties] classworlds.conf=/Users/usr/.sdkman/candidates/maven/current/bin/m2.conf
[echoproperties] sun.io.unicode.encoding=UnicodeBig
[echoproperties] library.jansi.path=/Users/usr/.sdkman/candidates/maven/current/lib/jansi-native
[echoproperties] ant.file.maven-antrun-=/Users/usr/study/maven/parent/productweb/target/antrun/build-main.xml
[echoproperties] project.build.directory=/Users/usr/study/maven/parent/productweb/target
[echoproperties] maven.dependency.org.springframework.spring-jcl.jar.path=/Users/usr/.m2/repository/org/springframework/spring-jcl/6.0.11/spring-jcl-6.0.11.jar
[echoproperties] java.class.path=/Users/usr/.sdkman/candidates/maven/current/boot/plexus-classworlds-2.6.0.jar
[echoproperties] org.apiguardian\:apiguardian-api\:jar=/Users/usr/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
[echoproperties] java.vm.vendor=Microsoft
[echoproperties] org.apache.geronimo.specs\:geronimo-servlet_3.0_spec\:jar=/Users/usr/.m2/repository/org/apache/geronimo/specs/geronimo-servlet_3.0_spec/1.0/geronimo-servlet_3.0_spec-1.0.jar
[echoproperties] project.groupId=com.goldenaarcher.product
[echoproperties] user.timezone=America/New_York
[echoproperties] maven.conf=/Users/usr/.sdkman/candidates/maven/current/conf
[echoproperties] project.build.outputDirectory=/Users/usr/study/maven/parent/productweb/target/classes
[echoproperties] java.vm.specification.version=17
[echoproperties] os.name=Mac OS X
[echoproperties] junit.version=5.10.0
[echoproperties] ant.file.type.maven-antrun-=file
[echoproperties] sun.java.launcher=SUN_STANDARD
[echoproperties] user.country=US
[echoproperties] sun.cpu.endian=little
[echoproperties] project.build.testSourceDirectory=/Users/usr/study/maven/parent/productweb/src/test/java
[echoproperties] user.home=/Users/usr
[echoproperties] user.language=en
[echoproperties] maven.dependency.org.junit.jupiter.junit-jupiter-engine.jar.path=/Users/usr/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.10.0/junit-jupiter-engine-5.10.0.jar
[echoproperties] ant.java.version=1.7
[echoproperties] org.springframework\:spring-jcl\:jar=/Users/usr/.m2/repository/org/springframework/spring-jcl/6.0.11/spring-jcl-6.0.11.jar
[echoproperties] maven.dependency.com.goldenaarcher.product.productservices.jar.path=/Users/usr/.m2/repository/com/goldenaarcher/product/productservices/1.0/productservices-1.0.jar
[echoproperties] org.springframework\:spring-core\:jar=/Users/usr/.m2/repository/org/springframework/spring-core/6.0.11/spring-core-6.0.11.jar
[echoproperties] ant.file=/Users/usr/study/maven/parent/productweb/pom.xml
[echoproperties] path.separator=\:
[echoproperties] os.version=13.5.2
[echoproperties] java.runtime.name=OpenJDK Runtime Environment
[echoproperties] java.vm.name=OpenJDK 64-Bit Server VM
[echoproperties] com.goldenaarcher.product\:productservices\:jar=/Users/usr/.m2/repository/com/goldenaarcher/product/productservices/1.0/productservices-1.0.jar
[echoproperties] ant.core.lib=/Users/usr/.m2/repository/org/apache/ant/ant/1.8.2/ant-1.8.2.jar
[echoproperties] java.vendor.url.bug=https\://github.com/microsoft/openjdk/issues
[echoproperties] user.dir=/Users/usr/study/maven/parent
[echoproperties] maven.dependency.org.junit.platform.junit-platform-engine.jar.path=/Users/usr/.m2/repository/org/junit/platform/junit-platform-engine/1.10.0/junit-platform-engine-1.10.0.jar
[echoproperties] os.arch=x86_64
[echoproperties] maven.multiModuleProjectDirectory=/Users/usr/study/maven/parent
[echoproperties] org.junit.platform\:junit-platform-commons\:jar=/Users/usr/.m2/repository/org/junit/platform/junit-platform-commons/1.10.0/junit-platform-commons-1.10.0.jar
[echoproperties] maven.dependency.org.opentest4j.opentest4j.jar.path=/Users/usr/.m2/repository/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar
[echoproperties] maven.dependency.org.apache.geronimo.specs.geronimo-servlet_3.0_spec.jar.path=/Users/usr/.m2/repository/org/apache/geronimo/specs/geronimo-servlet_3.0_spec/1.0/geronimo-servlet_3.0_spec-1.0.jar
[echoproperties] maven.dependency.org.springframework.spring-core.jar.path=/Users/usr/.m2/repository/org/springframework/spring-core/6.0.11/spring-core-6.0.11.jar
[echoproperties] org.springframework\:spring-context\:jar=/Users/usr/.m2/repository/org/springframework/spring-context/6.0.11/spring-context-6.0.11.jar
[echoproperties] maven.dependency.org.junit.jupiter.junit-jupiter-api.jar.path=/Users/usr/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.10.0/junit-jupiter-api-5.10.0.jar
[echoproperties] project.build.sourceDirectory=/Users/usr/study/maven/parent/productweb/src/main/java
[echoproperties] java.vm.info=mixed mode, sharing
[echoproperties] java.vm.version=17.0.8.1+1-LTS
[echoproperties] maven.dependency.org.springframework.spring-context.jar.path=/Users/usr/.m2/repository/org/springframework/spring-context/6.0.11/spring-context-6.0.11.jar
[echoproperties] maven.project.dependencies.versions=5.10.0\:1.10.0\:1.3.0\:1.10.0\:5.10.0\:1.1.2\:1.0\:1.0\:6.0.11\:6.0.11\:6.0.11\:6.0.11\:6.0.11\:6.0.11\:
[echoproperties] java.class.version=61.0
[echoproperties] ant.project.default-target=main
[echoproperties] maven.dependency.org.apiguardian.apiguardian-api.jar.path=/Users/usr/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for productparent 1.0:
[INFO]
[INFO] productparent ...................................... SUCCESS [  0.305 s]
[INFO] productservices .................................... SUCCESS [  0.074 s]
[INFO] productweb Maven Webapp ............................ SUCCESS [  0.048 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.510 s
[INFO] Finished at: 2023-09-20T21:02:03-04:00
[INFO] ------------------------------------------------------------------------

在这里插入图片描述

我这里应该只列出了一个项目(web)的属性……太长了,感觉拉不完……

这里主要就是提供了一些默认的 property 名称,如 project 相关信息,这个也可以在 POM 中直接使用。

下面的这个设定会直接用 artifactId 作为最终打包的名称:

<build><finalName>${project.artifactId}</finalName>
</build>

在这里插入图片描述

这样在 build 之后,最终的 war 文件名就是 productweb.war

还有一些其他的用法,包括访问 project.build.directory 等,这些还是在要用的时候 google 一下比较方便

除此之外它还可以访问 java 的系统属性,以及手写的一些属性,如用过不少次的 maven.compiler.source

目前最新版本的一些用法如下:

		<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>3.1.0</version><executions><execution><id>compile</id><phase>compile</phase><configuration><target><echo message="Project Name: ${project.name}" /></target></configuration><goals><goal>run</goal></goals></execution></executions></plugin></plugins>

它可以在命令行 echo 项目名称:

在这里插入图片描述

主要来说……用的不多就是了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/141792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现电商跨平台订单每日自动对账

场景描述&#xff1a; 多数商家都存在多电商平台同时经营的情况&#xff0c;而进行订单对账则是相关业务或财务人员的每日必修课。比如商家在天猫&#xff0c;苏宁&#xff0c;1号店&#xff0c;京东等均有运营店铺&#xff0c;每天需要通过各电商后台系统抓单打单&#xff0c…

若依cloud -【 100 ~ 103 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用&#xff0c;每个应用都部署在单独的一台机器里边&#xff0c;应用对应的日志的也单独存…

springboot如何接入netty,实现在线统计人数?

springboot如何接入netty&#xff0c;实现在线统计人数&#xff1f; Netty 是 一个异步事件驱动的网络应用程序框架 &#xff0c;用于快速开发可维护的高性能协议服务器和客户端。 Netty ​ 是一个 NIO 客户端服务器框架 ​&#xff0c;可以快速轻松地开发协议服务器和客户端等…

微表情识别API + c++并发服务器系统

微表情识别API c并发服务器系统 该项目只开源c并发服务器程序&#xff0c;模型API部分不开源 地址&#xff1a;https://github.com/lin-lai/-API- 更新功能 4.1版本 改用epoll实现IO多路复用并发服务器 项目介绍 本项目用于检测并识别视频中人脸的微表情 目标任务: 用户上…

【李沐深度学习笔记】线性代数

课程地址和说明 线性代数p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 线性代数 标量 标量&#xff08;scalar&#xff09;&#xff0c;亦称“无向量”。有些物理量&#xff0c;只具有数值大小&#xff0c…

基于微信小程序的校园失物招领系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

Qt创建线程(使用moveToThread方法创建子线程)

1.moveTothread方法: &#xff08;1&#xff09;要使用moveToThread方法必须继承与QObject类 &#xff08;2&#xff09;创建任务对象时不能指定父对象 例子&#xff1a; MyWork* work new MyWork(this); // error MyWork* work new MyWork; // ok &#xff08;3&#…

北工大汇编题——分支程序设计

题目要求 信息检素程序设计&#xff1a;在数据区&#xff0c;有9个不同的信息&#xff0c;编号 0-8&#xff0c;每个信息包括20 个字符。从键盘接收 0-8 之间的一个编号&#xff0c;然后再屏幕上显示出相应编号的信息内容&#xff0c;按“q”键退出 完整代码 DATAS SEGMENTn0…

搭建SpringBoot项目三种方式(超详细版)

目录 一、官网下载压缩包解压 二、通过Idea脚手架搭建 三、Spring Boot项目结构 3.1 pom.xml文件 3.2 启动类 3.3 配置文件 四、通过创建Maven项目添加依赖 一、官网下载压缩包解压 接下来我们搭建一个SpringBoot项目&#xff0c;并引入SpringMVC的功能&#xff0c;首先…

自学WEB服务器搭建01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端、后端&#xff08;服务端&#xff09;数据库 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发…

多线程进阶:常见的锁策略、CAS

之前我们所了解的属于多线程的初阶内容。今天开始&#xff0c;我们进入多线程进阶的学习。 锁的策略 乐观锁 悲观锁 这不是两把具体的锁&#xff0c;应该叫做“两类锁” 乐观锁&#xff1a;预测锁竞争不是很激烈&#xff08;这里做的工作可能就会少一些&#xff09; 悲观锁…

3.6+铁死亡+WGCNA+机器学习

今天给同学们分享一篇3.6铁死亡WGCNA机器学习的生信文章“Identification of ferroptosis related biomarkers and immune infiltration in Parkinsons disease by integrated bioinformatic analysis”&#xff0c;这篇文章于2023年3月14日发表在BMC Med Genomics期刊上&#…

Mac电脑信息大纲记录软件 OmniOutliner 5 Pro for Mac中文

OmniOutliner 5 Pro是一款专业级的Mac大纲制作工具&#xff0c;它可以帮助用户更好地组织和管理信息&#xff0c;以及制作精美的大纲。以下是OmniOutliner 5 Pro的主要功能和特点&#xff1a; 强大的大纲组织和管理功能。OmniOutliner 5 Pro为用户提供了多层次的大纲结构&…

【QT】QT事件Event大全

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT中的事件Event技术&#xff0c;主要从QT事件流程和常用QT事件方法等方面展开&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易…

virtualbox安装linux虚拟机访问互联网(外网)的方法

virtualbox安装linux虚拟机访问互联网&#xff08;外网&#xff09;的方法 设置方法效果图 设置方法 效果图

Linux系统编程-文件

目录 1、系统编程介绍以及文件基本操作文件编程系统调用文件基本读写练习 2、文件描述符以及大文件拷贝文件描述符大文件拷贝对比试验 3、文件实战练习 1、系统编程介绍以及文件基本操作 系统编程是基于Linux封装好的一些函数&#xff0c;进行开发。 Linux文件信息属性在indo…

用AI解决量子学问题

3 人工智能用于量子力学 在这一部分中&#xff0c;我们提供了有关如何设计高级深度学习方法以有效学习神经波函数的技术评述。在第3.1节中&#xff0c;我们概述了一般情况下定义和解决量子多体问题的方法。在第3.2节中&#xff0c;我们介绍了学习量子自旋系统基态的方法。在第…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家&#xff0c;我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司&#xff0c;但了解到的收款手续费率通常都在0.6左右&#xff0c;最低也只能降到0.38。这个过程吃过不少苦头。毕竟&#xff0c;收款功能是我们商家的命脉&…

Java笔记三

包机制&#xff1a; 为了更好地组织类&#xff0c;Java提供了包机制&#xff0c;用于区别类名的命名空间。 包语句的语法格式为&#xff1a;pack pkg1[. pkg2[. pkg3...]]; 般利用公司域名倒置作为包名&#xff1b;如com.baidu.com&#xff0c;如图 导包&#xff1a; 为了能够…

Python学习 day01(注意事项)

注释 print语句 变量 数据类型的转换 运算符 / 的结果为浮点数。若// 的两边有一个为浮点数&#xff0c;则结果为浮点数&#xff0c;否则为整数。 字符串 7. 精度控制 8. input()