J'utilise Gradle depuis longtemps, mais je dois utiliser Maven pour le travail, alors j'étudie.
Outil de construction Java. OSS. Il semble avoir été créé comme une alternative à Apache Ant.
La lecture est "Maven" ou "Maven" (je suis une école Maven).
Il existe depuis longtemps [^ 1], mais il est encore en développement, et j'ai l'impression qu'il y a beaucoup de projets qui utilisent Maven. À partir de 2020, Maven ou Gradle sont souvent les choix pour les outils de construction Java (je pense).
[^ 1]: Maven 1.0 en 2004, Maven 2.0 en 2005, Maven 3.0 en 2010 (Maven - Maven Releases History)
La version principale à partir de 2020 est la 3. Maven 1 et 2 sont incompatibles, mais 2 et 3 le sont.
>mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: ...\bin\..
Java version: 11.0.6, vendor: AdoptOpenJDK, runtime: ...
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
-Téléchargez l'archive (ʻapache-maven-X.X.X-bin.zip`) depuis Site officiel
État après dégivrage
`-apache-maven-X.X.X/
|-bin/
|-boot/
|-conf/
|-lib/
|-LICENSE
|-NOTICE
`-README.txt
dans l'exemple ci-dessus) est ensuite décrit comme
% MAVEN_HOME%`.--Passez le chemin vers % MAVEN_HOME% \ bin
Confirmation de l'installation
>mvn --version
Apache Maven X.X.X (...)
...
Les paramètres communs à tous les projets peuvent être décrits dans l'un des fichiers suivants.
%MAVEN_HOME%\conf\settings.xml
%USERPROFILE%\.m2\settings.xml
[^2][^ 2]: % USERPROFILE%
est une variable d'environnement Windows qui pointe vers le domicile de l'utilisateur (pour Linux, cela signifie $ HOME
).
Le contenu défini dans l'ancien fichier est commun à tous les projets des utilisateurs. Le contenu défini dans ce dernier fichier est commun à tous les projets de l'utilisateur.
L'ancien fichier se trouve dans le zip téléchargé, mais tous les paramètres sont vides et expliqués dans les commentaires. Ce dernier fichier n'existe pas au début, c'est donc une bonne idée de copier l'ancien fichier.
settings.xml
<settings ...>
...
<proxies>
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>
...
</settings>
Réécrivez les paramètres requis et écrivez-les dans l'un des settings.xml
ci-dessus.
Hello World
--Ouvrez la ligne de commande dans un dossier approprié et exécutez la commande suivante.
> mvn archetype:generate
――Pour la première fois, la liste suivante sera affichée une fois que divers processus tels que le téléchargement ont été effectués.
...
Choose archetype:
1: internal -> org.appfuse.archetypes:appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF)
2: internal -> org.appfuse.archetypes:appfuse-basic-spring (AppFuse archetype for creating a web application with Hibernate, Spring and Spring MVC)
3: internal -> org.appfuse.archetypes:appfuse-basic-struts (AppFuse archetype for creating a web application with Hibernate, Spring and Struts 2)
...
16: internal -> org.apache.maven.archetypes:maven-archetype-quickstart ()
...
57: internal -> org.fusesource.scalate.tooling:scalate-archetype-empty (Generates a Scalate empty web application)
58: internal -> org.fusesource.scalate.tooling:scalate-archetype-guice (Generates a Scalate Jog web application)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 16:
--Choisir l'archétype
s'affiche et vous êtes invité à entrer le numéro de l'archétype à utiliser.
Define value for property 'groupId': : 【com.example】
Define value for property 'artifactId': : 【hello-world】
Define value for property 'version': 1.0-SNAPSHOT: :【】
Define value for property 'package': com.example: :【】
Confirm properties configuration:
groupId: com.example
artifactId: hello-world
version: 1.0-SNAPSHOT
package: com.example
Y: : 【y】
y
et entrezest créé dans le dossier courant. --Si vous l'avez créé dans l'exemple ci-dessus, un dossier appelé
hello-world` est créé.hello-world
est le suivanthello-Le contenu du dossier world
hello-world/
|-pom.xml
`-src/
|-main/java/
| `-com/example/
| `-App.java
`-test/java/
`-com/example/
`-AppTest.java
pom.xml
<?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.example</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>hello-world</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
...
</plugins>
</pluginManagement>
</build>
</project>
App.java
package com.example;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
compiler
> mvn compile
est affiché sous
hello-world / target / classes / `.
--Exécuter avec la commande suivantehello-Monde de course
> java -cp target\classes com.example.App
Hello World!
mvn archetype: generate
implémente un mécanisme appelé ** archetype ** qui génère automatiquement un projet à partir d'un modèle.maven-archetype-quickstart
est sélectionné pour générer automatiquement le projet.POM Maven – Introduction to the POM
Les paramètres Maven sont décrits dans un fichier XML appelé pom.xml. POM est une abréviation de Project Object Model.
Maven gère les cibles de build dans des unités appelées ** projets **. Le POM est un fichier qui décrit divers paramètres du projet.
Super POM Les POM ont une relation parent-enfant et il existe un ** Super POM ** comme parent le plus élevé de tous les POM. Par exemple, le dernier Super POM peut être trouvé sur la page suivante.
Maven Model Builder – Super POM
S'il n'y a pas de réglage dans le POM du projet, le réglage du POM parent est fondamentalement hérité. En d'autres termes, le Super POM est un POM qui décrit les paramètres par défaut qui s'appliquent à tous les projets.
En supposant que nous créons un POM avec la configuration minimale, le contenu de pom.xml est le suivant.
Configuration minimale pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
<modelVersion>
<groupId>
<artifactId>
<version>
--<modelVersion>
spécifie la version de POM
――Cela ne change fondamentalement pas, donc je pense que vous devriez spécifier cette valeur pour le moment.
--<groupId>
,<artifactId>
,<version>
définissent des informations pour identifier de manière unique le projet.<groupId>: <artifactId>: <version>
<groupId>
--Pour groupId
, spécifiez un nom qui peut identifier l'organisation à laquelle appartient le projet ou le projet supérieur.groupId
de ʻorg.apache.maven.plugins. --
.` Peut ou ne peut pas être joint ("junit" etc. ne sont pas joints)groupId
ne doit pas nécessairement correspondre à la structure du package Java du projet, mais il est plus sûr de la faire correspondre pour moins de confusion.
<artifactId>
--Spécifiez un nom qui identifie le projet
--Par exemple, le plug-in de compilateur fourni par Maven est maven-compiler-plugin
, qui est ʻartifactId`.<version>
--version
spécifie la version du projet
--groupId
et ʻartifactId identifieront de manière unique le projet, et
version` identifiera la version.<url> https://repo.maven.apache.org/maven2 </ url>
est adopté pour le paramétrage de <repository>
qui n'est pas décrit.
――Cependant, certains paramètres ne sont pas décrits dans Super POM mais sont adoptés par défaut (comme `[^ 3]: Je pense que "`
-SNAPSHOT
à la fin a une signification particulière.-SNAPSHOT
indique qu'il s'agit d'une version en cours de développement.Dans pom.xml, les variables peuvent être référencées pour éviter le problème de duplication de la même valeur à plusieurs endroits.
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>project.groupId = ${project.groupId}</echo>
<echo>project.artifactId = ${project.artifactId}</echo>
<echo>project.version = ${project.version}</echo>
<echo>project.build.directory = ${project.build.directory}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
«D'une manière ou d'une autre, beaucoup d'entre eux sont apparus soudainement, mais les points importants ici sont les suivants.
Extraire uniquement les parties importantes
<echo>project.groupId = ${project.groupId}</echo>
<echo>project.artifactId = ${project.artifactId}</echo>
<echo>project.version = ${project.version}</echo>
<echo>project.build.directory = ${project.build.directory}</echo>
--Choisir les valeurs de certaines variables
Résultat d'exécution
> mvn antrun:run
...
[echo] project.groupId = example
[echo] project.artifactId = hello
[echo] project.version = 1.0.0
[echo] project.build.directory = F:\tmp\maven\hello\target
...
$ {expression de référence variable}
est remplacée par le résultat de l'évaluation de l'expression et de la sortie.
--Toutes les variables référencées dans cet exemple sont appelées ** Variables de modèle de projet **.<projet>
dans pom.xml.
--project.version
fait référence à la valeur de<projet> <version>
--project.build.directory
n'est pas dans ce pom.xml, mais dans Super POM Déclaré enpom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>project.class = ${project.class}</echo>
<echo>project.getClass() = ${project.getClass()}</echo>
<echo>plugins[0].artifactId = ${project.build.plugins[0].artifactId}</echo>
<echo>plugins[1].artifactId = ${project.build.plugins[1].artifactId}</echo>
<echo>plugins[2].artifactId = ${project.build.plugins[2].artifactId}</echo>
</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeps-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn antrun:run
...
[echo] project.class = class org.apache.maven.model.Model
[echo] project.getClass() = ${project.getClass()}
[echo] plugins[0].artifactId = maven-antrun-plugin
[echo] plugins[1].artifactId = maven-jdeps-plugin
[echo] plugins[2].artifactId = ${project.build.plugins[2].artifactId}
$ {...}
vous permet essentiellement de faire référence à la propriété de l'objet séparée par des points (.
).
--Lorsque vous faites référence à la propriété nommée foo
, la méthode getFoo ()
(ou ʻisFoo () `) est exécutée dans les coulisses.class
).
--Cependant, vous ne pouvez faire référence qu'aux propriétés, vous ne pouvez pas exécuter les méthodes directement.
--Si la propriété est un tableau ou une Liste
, vous pouvez utiliser des crochets ([]
) comme référence d'index.
--Si l'expression ne peut pas être évaluée avec succès, elle sera traitée comme une simple chaîne.
--La substance de la variable project
est [org.apache.maven.model.Model](https://maven.apache.org/ref/current/maven-model/apidocs/org/apache/maven/model/Model C'est une instance d'une classe appelée .html)
--Cette instance Model
est [ReflectionValueExtractor](https://github.com/apache/maven-shared-utils/blob/master/src/main/java/org/apache/maven/shared/utils/introspection/ReflectionValueExtractor L'expression est évaluée en étant passée à .java # L163)pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>${project.build.pluginsAsMap(org.apache.maven.plugins:maven-antrun-plugin).id}</echo>
<echo>${project.build.pluginsAsMap(org.apache.maven.plugins:maven-jdeps-plugin).id}</echo>
</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeps-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn antrun:run
...
[echo] org.apache.maven.plugins:maven-antrun-plugin:1.8
[echo] org.apache.maven.plugins:maven-jdeps-plugin:3.1.2
--Si la propriété est Map
, vous pouvez vous référer à la spécification de clé sous la forme fooMap (<key>)
.
--<key>
n'a pas besoin d'être placé entre guillemets doubles ( "
), et est utilisé tel quel comme clé de String
.
--La propriété pluginsAsMap
est une classe appelée PluginContainer Fait référence à la méthode définie dans
--Cette Map
a [Plugin # getKey ()](https://maven.apache.org/ref/3.6.3/maven-model/apidocs/org/apache/maven/model/Plugin.html" comme clé. En conséquence de # getKey-), l'instance Plugin
correspondant à la valeur est définie.
--Plugin # getKey ()
retourne la valeur des groupId
et ʻartifactId du plugin reliés par un signe deux-points (
: `).
project.build
est Il hérite de ce PluginContainer
~ AsMap
L'image globale de chaque classe et propriété qui peut être référencée à partir de Model
est résumée dans le diagramme de classes.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
...
<target>
<echo>project.basedir = ${project.basedir}</echo>
<echo>project.baseUri = ${project.baseUri}</echo>
<echo>maven.build.timestamp = ${maven.build.timestamp}</echo>
</target>
...
</build>
</project>
Résultat d'exécution
[echo] project.basedir = F:\tmp\maven\hello
[echo] project.baseUri = file:///F:/tmp/maven/hello/
[echo] maven.build.timestamp = 2020-03-04T13:45:10Z
project.basedir
project.baseUri
--project.basedir
représenté par l'URImaven.build.timestamp
maven.build.timestamp.format
, vous pouvez spécifier le format de maven.build.timestamp
de manière arbitraire.
―― Le format du format suit SimpleDateFormat.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
<maven.build.timestamp.format>yyyy/MM/dd HH:mm:ss</maven.build.timestamp.format>
</properties>
<build>
...
<echo>maven.build.timestamp = ${maven.build.timestamp}</echo>
...
</build>
</project>
Résultat d'exécution
[echo] maven.build.timestamp = 2020/03/04 13:49:49+00:00
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
<foo>FOO!!</foo>
<fizz.buzz>FIZZ.BUZZ!?</fizz.buzz>
<hoge-fuga>HOGE-FUGA??</hoge-fuga>
</properties>
<build>
...
<echo>foo = ${foo}</echo>
<echo>fizz.buzz = ${fizz.buzz}</echo>
<echo>hoge-fuga = ${hoge-fuga}</echo>
<echo>FOO = ${FOO}</echo>
...
</build>
</project>
Résultat d'exécution
[echo] foo = FOO!!
[echo] fizz.buzz = FIZZ.BUZZ!?
[echo] hoge-fuga = HOGE-FUGA??
[echo] FOO = ${FOO}
-
et .
peuvent être inclus dans le nom
--Sensible aux majuscules et minusculesxml.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
...
<echo>hoge = ${env.hoge}</echo>
<echo>Hoge = ${env.Hoge}</echo>
<echo>HOGE = ${env.HOGE}</echo>
...
</build>
</project>
Résultat d'exécution(Lors de l'exécution sous Windows)
> set Hoge=Hello
> mvn antrun:run
...
[echo] hoge = ${env.hoge}
[echo] Hoge = ${env.Hoge}
[echo] HOGE = Hello
...
Résultat d'exécution(Lors de l'exécution sous Linux)
$ export Hoge=Hello
$ mvn antrun:run
...
[echo] hoge = ${env.hoge}
[echo] Hoge = Hello
[echo] HOGE = ${env.HOGE}
$ {env. Nom de la variable d'environnement}
--Lors de l'exécution sous Windows, le nom de la variable ʻenv` est ** normalisé dans toutes les majuscules **pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
<foo.bar>foo-bar</foo.bar>
<fizz.buzz>fizz-buzz</fizz.buzz>
</properties>
<build>
...
<echo>java.version = ${java.version}</echo>
<echo>java.vm.vendor = ${java.vm.vendor}</echo>
<echo>foo.bar = ${foo.bar}</echo>
<echo>fizz.buzz = ${fizz.buzz}</echo>
...
</build>
</project>
Résultat d'exécution
> mvn antrun:run -Dfoo.bar=FOO-BAR
...
[echo] java.version = 11.0.6
[echo] java.vm.vendor = AdoptOpenJDK
[echo] foo.bar = FOO-BAR
[echo] fizz.buzz = fizz-buzz
System.getProperties ()
) comme avec $ {nom de la propriété système}
.
--Si une propriété avec le même nom est déclarée dans `--Il existe deux types de référentiels
groupId
--Si vous recherchez "Maven Central Repository Publishing Procedure", vous trouverez divers articles de commentaires.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
--<dependency>
sous<dependencies>
pointe vers un artefact
% USERPROFILE% \ .m2 \ repository
$ HOME / .m2 / repository
Pom lorsqu'un référentiel distant est spécifié.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<repositories>
<repository>
<id>my-private-repository</id>
<name>My Private Repository</name>
<url>http://private.repository.host/repository</url>
<layout>default</layout>
</repository>
</repositories>
</project>
** Image proxy **
Dans Maven, tout le traitement est effectué par ** Plugin **.
Par exemple, le processus de compilation du code source Java est fourni par maven-compiler-plugin.
Vous pouvez trouver une liste des plugins de base fournis par le projet Maven lui-même sur Maven - Plugins disponibles.
Il existe deux manières principales d'exécuter les objectifs d'un plug-in.
La méthode de liaison à la deuxième phase est mise de côté et la méthode de spécification directe de 1 est confirmée en premier.
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
Exécutez le plug-in jdeps
> mvn org.apache.maven.plugins:maven-jdeps-plugin:3.1.2:jdkinternals
...
classes -> java.base
example -> java.io java.base
example -> java.lang java.base
...
<nom complet>: <nom de l'objectif>
--<nom complet>
est ici ʻorg.apache.maven.plugins: maven-jdeps-plugin: 3.1.2, --
<nom de l'objectif> devient
jdkinternals`―― Comme il est difficile de saisir le nom complet à chaque fois, vous pouvez également omettre la description suivante.
Si omis
> mvn jdeps:jdkinternals
...
classes -> java.base
example -> java.io java.base
example -> java.lang java.base
...
<préfixe>: <nom de l'objectif>
:
) [^ 4]:
, spécifiez avec le nom complet groupId: artifactId: version: goal
.
--S'il y a deux :
, spécifiez groupId: artifactId: goal
sans le numéro de version.
--S'il n'y a qu'un seul :
, spécifiez avec le préfixe prefix: goal
--Si le préfixe est spécifié, le nom complet sera résolu comme suit.groupdId
être l'un des suivants:
org.apache.maven.plugin
org.codehaus.mojo
maven-metadata.xml
) pour chaque groupId
maven-metadata.xml
, vous pouvez voir que la correspondance du préfixe est répertoriée pour chaque ʻartifactId`.xml:org.apache.maven.plugin maven-metadata-xml
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<plugins>
<plugin>
<name>Apache Maven ACR Plugin</name>
<prefix>acr</prefix>
<artifactId>maven-acr-plugin</artifactId>
</plugin>
...
<plugin>
<name>Apache Maven JDeps Plugin</name>
<prefix>jdeps</prefix>
<artifactId>maven-jdeps-plugin</artifactId>
</plugin>
...
</plugins>
</metadata>
--Trouvez une correspondance dans ce maven-metadata.xml
qui correspond au préfixe spécifié sur la ligne de commande, et définissez ce <artifactId>
sur ʻartifactId`.
jdeps
, maven-jdeps-plugin
devient ʻartifactId`.maven-metadata.xml
) pour chaque ʻartifactId`maven-jdeps-plugin maven-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeps-plugin</artifactId>
<versioning>
<latest>3.1.2</latest>
<release>3.1.2</release>
<versions>
<version>3.0.0</version>
<version>3.1.0</version>
<version>3.1.1</version>
<version>3.1.2</version>
</versions>
<lastUpdated>20190619052916</lastUpdated>
</versioning>
</metadata>
--Définissez la valeur définie dans la version finale (<release>
) sur version
--S'il n'y a pas de version finale, laissez la dernière version (<latest>
) [^ 5] être version
.
--Les groupId
, ʻartifactId,
versiondéterminés ci-dessus sont des noms complets. -
groupId:
org.apache.maven.plugin -
artifactId:
maven-jdeps-plugin -
version:
3.1.2`
[^ 4]: Strictement parlant, une spécification telle que compiler :::: compile
est également considérée comme une spécification de préfixe, mais ici le nombre de deux-points est utilisé par souci de clarté (pour plus de détails, [implémentation MojoDescriptorCreator] Voir](https://github.com/apache/maven/blob/maven-3.6.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoDescriptorCreator.java#L141) )
[^ 5]: «
-Dans la méthode de ↑, la version du plug-in est décidée en fonction des métadonnées.
groupId
est soit ʻorg.apache.maven.plugin soit ʻorg.codehaus.mojo
[^ 6]groupId
autre que ceux-ci en spécifiant un préfixe, vous devez définir le plug-in explicitement.[^ 6]: Strictement parlant, vous pouvez ajouter le groupId
à rechercher par <pluginGroups> ʻin
settings.xml` (Référence: Introduction to Plugin Prefix Resolution guides / introduction / introduction-to-plugin-prefix-mapping.html # Configuring_Maven_to_Search_for_Plugins))
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<version>1.5.8</version>
</plugin>
</plugins>
</build>
</project>
--Les plugins individuels sont définis avec la balise <plugin>
--<plugin>
est répertorié sous<build> <plugins>
--Spécifiez le nom complet du plug-in avec <groupId>
, <artifactId>
, <version>
sur
1.5.8`.asciidoctor-maven-Plug-in en cours d'exécution
> mvn asciidoctor:process-asciidoc
...
[INFO] BUILD SUCCESS
...
-Lorsque le plug-in est spécifié par <plugin>
comme dans ↑, la méthode de résolution du nom complet à partir de la spécification de préfixe change un peu.
plugin.xml
de chaque plug-in explicitement défini dans pom.xml.plugin.xml
est stocké sous META-INF / maven
dans le fichier jar du plugin.
--Par exemple, le plugin.xml
de ʻasciidoctor-mavne-plugin` ressemble à ceci:asciidoctor-maven-plugin plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by maven-plugin-tools 3.5 on 2019-03-30 -->
<plugin>
<name>Asciidoctor Maven Plugin and Doxia Parser</name>
<description>Asciidoctor Maven Plugin and Doxia Parser (for Maven Site integration)</description>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<version>1.5.8</version>
<goalPrefix>asciidoctor</goalPrefix>
<isolatedRealm>false</isolatedRealm>
<inheritedByDefault>true</inheritedByDefault>
...
<goalPrefix>
groupId
et ʻartifactIddont la valeur est égale au préfixe spécifié sur la ligne de commande sont adoptés. --Enfin,
version est déterminée comme suit --Si spécifié dans pom.xml, cette version sera adoptée --Si non spécifié, il est déterminé à partir des métadonnées (
maven-metadata.xml) pour chaque ʻartifactId
(même méthode que lorsqu'aucun plug-in n'est spécifié).--Dans l'explication jusqu'à présent, on peut voir que ʻartifactId` et le préfixe sont essentiellement sans rapport.
<prefix>
dans maven-metadata.xml
ou <goalPrefix> ʻin
plugin.xml. Cependant, dans les plug-ins qui existent réellement, ʻartifactId
et prefix ont la relation suivante.
--Pour les plug-ins officiels fournis par le projet Maven
--Si ʻartifactId est
maven-XXX-plugin,
XXX est le préfixe --Pour les autres plug-ins --Si ʻartifactId
est XXX-maven-plugin
, XXX
est le préfixe
―― Ce sont les résultats de ces règles de dénomination recommandées, et cela ne signifie pas que vous ne pouvez pas créer un plug-in sans ce nom.maven-XXX-plugin
est destiné à indiquer qu'il s'agit du plug-in officiel de Maven, donc soyez prudent car l'utilisation non officielle de ce nom entraînera une contrefaçon de marque **
- Important Notice: Plugin Naming Convention and Apache Maven Trademark comme
XXX-maven-plugin à moins qu'il n'y ait une raison particulière. «Ainsi, ʻartifactId
et le préfixe ne sont pas essentiellement liés, mais il est normal de penser qu'ils sont liés dans la pratique (je pense).
--Ainsi, si ʻartifactId est
foo-maven-plugin, vous pouvez considérer le préfixe comme
foo` (je pense)foo
, ʻartifactId peut être considéré comme
foo-maven-plugin` (s'il ne s'agit pas d'un plugin fourni par le projet Maven).pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>Hello World!!</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn antrun:run
...
main:
[echo] Hello World!!
...
<configuration>
sous <plugin>
run
liste les paramètres qui peuvent être spécifiés avec <configuration>
.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn help:describe
...
Name: Apache Maven AntRun Plugin
Description: Runs Ant scripts embedded in the POM
Group Id: org.apache.maven.plugins
Artifact Id: maven-antrun-plugin
Version: 1.8
Goal Prefix: antrun
This plugin has 2 goals:
antrun:help
Description: Display help information on maven-antrun-plugin.
Call mvn antrun:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
antrun:run
Description: Maven AntRun Mojo.
This plugin provides the capability of calling Ant tasks from a POM by
running the nested Ant tasks inside the <tasks/> parameter. It is
encouraged to move the actual tasks to a separate build.xml file and call
that file with an <ant/> task.
For more information, run 'mvn help:describe [...] -Ddetail'
...
-En exécutant l'objectif décrire, vous pouvez décrire le plugin spécifié par <configuration>
. Peut être confirmé
--<groupId>
et<artifactId>
permettent au plug-in d'être identifié comme maven-antrun-plugin
.
-- describe
Comme vous pouvez le voir sur la page de description de l'objectif, vous pouvez affiner l'objectif avec <goal>
et afficher les détails (paramètres pouvant être spécifiés pour chaque objectif) avec <detail>
.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<goal>run</goal>
<detail>true</detail>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn help:describe
...
antrun:run
Description: Maven AntRun Mojo.
...
Implementation: org.apache.maven.plugin.antrun.AntRunMojo
Language: java
Available parameters:
...
target
The XML for the Ant target. You can add anything you can add between
<target> and </target> in a build.xml.
...
...
-Bien que l'exemple de ↑ soit omis, tous les paramètres sont affichés avec des explications.
<configuration>
de help: describe
peuvent également être spécifiés à partir des propriétés système.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn help:describe -Dplugin=antrun
...
Name: Apache Maven AntRun Plugin
Description: Runs Ant scripts embedded in the POM
Group Id: org.apache.maven.plugins
Artifact Id: maven-antrun-plugin
Version: 1.8
Goal Prefix: antrun
This plugin has 2 goals:
antrun:help
Description: Display help information on maven-antrun-plugin.
...
antrun:run
Description: Maven AntRun Mojo.
...
For more information, run 'mvn help:describe [...] -Ddetail'
...
---Dplugin = antrun
est spécifié comme propriété système lors de l'exécution de Maven
plugin
.plugin
.plugin
correspond juste, comme antrun skip Certains ne le sont paspom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
<plugin>jdeps</plugin>
</properties>
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</build>
</project>
--Dans <properties>
, jdeps
est défini dans plugin
.
Résultat de l'exécution (lorsque le plugin n'est pas spécifié dans les propriétés système)
> mvn help:describe
...
Name: Apache Maven JDeps Plugin
Description: The JDeps Plugin uses the jdeps tool to analyze classes for
internal API calls.
Group Id: org.apache.maven.plugins
Artifact Id: maven-jdeps-plugin
Version: 3.1.2
Goal Prefix: jdeps
...
Résultat de l'exécution (lorsque le plugin est spécifié dans les propriétés système)
> mvn help:describe -Dplugin=antrun
...
Name: Apache Maven AntRun Plugin
Description: Runs Ant scripts embedded in the POM
Group Id: org.apache.maven.plugins
Artifact Id: maven-antrun-plugin
Version: 1.8
Goal Prefix: antrun
...
--Si aucune propriété système n'est spécifiée, la valeur spécifiée dans <properties>
(jdeps
) est adoptée.
--Si vous spécifiez une propriété système, cette valeur (ʻantrun`) est adoptée.
――Même si vous dites "construire" en un mot, son contenu comprend divers processus. --Par exemple, pour construire un programme Java simple, le traitement suivant peut être envisagé.
--Maven a les trois cycles de vie suivants en standard.
- default
- clean
- site
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classes
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
deploy
clean
définit un cycle de vie pour supprimer les artefacts du projet
--clean
Le cycle de vie comprend les phases suivantes
pre-clean
clean
post-clean
pre-site
site
post-site
site-deploy
--Par exemple, dans le cycle de vie «propre» et le cycle de vie «site», les objectifs sont liés comme suit:
** plug-in propre **
Phase | Brancher | objectif |
---|---|---|
pre-clean |
- | - |
clean |
maven-clean-plugin |
clean |
post-clean |
- | - |
** plug-in de site **
Phase | Brancher | objectif |
---|---|---|
pre-site |
- | - |
site |
maven-site-plugin |
site |
post-site |
- | - |
site-deploy |
maven-site-plugin |
deploy |
clean
exécutera le but clean
du maven-clean-plugin
.packaging
-Packaging est une valeur de paramètre qui détermine comment empaqueter le projet, et l'une des valeurs suivantes peut être spécifiée.
- pom
- jar
- ejb
- maven-plugin
- war
- ear
- rar
--Ce packaging est spécifié sur pom.xml comme suit:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<packaging>jar</packaging>
...
</project>
jar
est spécifié comme emballage.jar
-- par défaut
Les objectifs associés aux phases du cycle de vie diffèrent selon l'emballage comme suit:
valider
etc.)pom
Phase | Brancher | objectif |
---|---|---|
install |
maven-install-plugin |
install |
deploy |
maven-deploy-plugin |
deploy |
jar
Phase | Brancher | objectif |
---|---|---|
process-resources |
maven-resources-plugin |
resources |
compile |
maven-compiler-plugin |
compile |
process-test-resources |
maven-resources-plugin |
testResources |
test-compile |
maven-compiler-plugin |
testCompile |
test |
maven-surefire-plugin |
test |
package |
maven-jar-plugin |
jar |
install |
maven-install-plugin |
install |
deploy |
maven-deploy-plugin |
deploy |
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
Lancer la phase de test
> mvn test
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello ---
...
--Phase peut être exécuté en le spécifiant dans l'argument de la commande mvn.
test
dans un projet dont le packaging est jar
.
--packaing prend la valeur par défaut jar
car la description de <packaing>
est omise.
--Si vous spécifiez une phase et l'exécutez, toutes les phases antérieures à cette phase seront également exécutées dans l'ordre.maven-resources-plugin: resources
, maven-compiler-plugin: compile
, ... sont exécutés. maven-resources-plugin: resources
Le but est dans la phase resources
,
maven-compiler-plugin: compile
Le but est lié à la phase compile
> mvn clean compiler:compile
--Plusieurs phases et objectifs peuvent être spécifiés dans la commande mvn et exécutés.
clean
→ compiler: compile
.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<configuration>
<target>
<echo>Hello Antrun!!</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn compile
...
[INFO] --- maven-antrun-plugin:1.8:run (default) @ hello ---
[INFO] Executing tasks
main:
[echo] Hello Antrun!!
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
--Tout objectif peut être lié à n'importe quelle phase
<phase>
et spécifiez l'objectif à lier avec <goals> <goal>
<goals> <goal>
, il est possible de lier plusieurs objectifs du même plug-in à une phase.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeps-plugin</artifactId>
<version>3.2.6</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jdkinternals</goal>
<goal>test-jdkinternals</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn verify
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello ---
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello ---
...
[INFO] --- maven-jdeps-plugin:3.1.2:jdkinternals (default) @ hello ---
...
[INFO] --- maven-jdeps-plugin:3.1.2:test-jdkinternals (default) @ hello ---
jdkinternals
et test-jdkinternals
de maven-jdeps-plugin
à la phase verify
--Si plusieurs objectifs sont liés à une phase, ces objectifs seront exécutés dans l'ordre déclaré sur pom.xml [^ 7]jdkinternals
→ test-jdkinternals
.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>foo</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>bar</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<configuration>
<target>
<echo>Hello Antrun!!</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn compile
...
[INFO] --- maven-antrun-plugin:1.8:run (foo) @ hello ---
...
[echo] Hello Antrun!!
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-antrun-plugin:1.8:run (bar) @ hello ---
...
[echo] Hello Antrun!!
...
--Si vous écrivez plusieurs balises <execution> '', vous pourrez lier des objectifs à plusieurs phases. --Si vous spécifiez plus d'un «<execution>», vous devez également spécifier la balise «<id>». --Définissez
sur une valeur unique qui peut identifier le
<exécution> --Cette valeur est sortie sur la console à l'exécution (
(foo)partie de
maven-antrun-plugin: 1.8: run (foo)) --Il est utile pour le débogage lorsque la construction ne se passe pas bien car ce sont des informations pour identifier quelle
<exécution> 'a été exécutée.
――Par conséquent, il est préférable de donner un nom descriptif facile à identifier.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>foo</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo>VALIDATE!!</echo>
</target>
</configuration>
</execution>
<execution>
<id>bar</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo>COMPILE!!</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn compile
...
[INFO] --- maven-antrun-plugin:1.8:run (foo) @ hello ---
...
[echo] VALIDATE!!
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-antrun-plugin:1.8:run (bar) @ hello ---
...
[echo] COMPILE!!
...
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<target>
<echo>Hello @ default-cli</echo>
</target>
</configuration>
</execution>
<execution>
<id>validate-phase</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo>Hello @ validate-phase</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn antrun:run
...
[echo] Hello @ default-cli
...
> mvn validate
...
[echo] Hello @ validate-phase
...
--Si vous exécutez le but directement, ʻid est par défaut
default-cli`
<execution> <id>
avec cette valeur, vous pouvez décrire le paramètre qui est appliqué uniquement lorsque l'objectif est exécuté directement.--Depuis 3.3.1 de Maven, il est possible d'exécuter le but en spécifiant «
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<target>
<echo>Hello default-cli!!</echo>
</target>
</configuration>
</execution>
<execution>
<id>foo</id>
<configuration>
<target>
<echo>Hello Foo!!</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn antrun:run
...
[echo] Hello default-cli!!
> mvn antrun:run@foo
...
[echo] Hello Foo!!
--ʻAntrun: Si vous exécutez uniquement avec run,
default-clisera mieux exécuté -En suivant la spécification de l'objectif avec
@ , comme ʻantrun: run @ foo
, le <execution>
du `
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn verify
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello ---
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello ---
...
[INFO] --- maven-checkstyle-plugin:3.1.1:check (default) @ hello ---
verify
--Dans pom.xml, seul «check
est exécuté dans la phase verify
.<exécution>
, elle sera exécutée dans la phase associée à ce défaut.<plugin>
-Certains plugins de base (tels que maven-compiler-plugin
) sont automatiquement appliqués en fonction des paramètres d'empaquetage
--Si un préfixe est spécifié, groupId
, ʻartifactId,
version` seront automatiquement résolus.<plugin>
.――Vous pouvez avoir une relation parent-enfant dans le projet
Structure des dossiers
|-pom.xml
`-child/
`-pom.xml
--Mettez le pom.xml du projet parent dans le dossier supérieur et le pom.xml du projet enfant dans le dossier child
.
/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>artifactId = ${project.artifactId}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--Dans le projet parent pom.xml, vous devez spécifier pom
pour <packaging>
/child/pom.xml
<?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>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child</artifactId>
</project>
--Dans le projet enfant pomx.ml, utilisez <parent>
pour spécifier le parent
--<parent>
spécifie groupId
, ʻartifactId,
version` pour identifier le POM parent
--Dans un projet de relation parent-enfant, le POM enfant hérite du POM parent.
Résultat de l'exécution (dossier supérieur)
> mvn antrun:run
...
[echo] artifactId = parent
Résultat de l'exécution (dossier enfant)
> mvn antrun:run
...
[echo] artifactId = child
<plugins>
est également hérité, l'ensemble de plug-ins ʻantrun` dans le projet parent peut également être utilisé dans le projet enfant.--Parent pom.xml défini avec `
--Cependant, dans le cas d'une structure de dossiers comme ↓, il est nécessaire de spécifier le chemin avec <relativePath>
.
Structure des dossiers
|-parent/
| `-pom.xml
`-child/
`-pom.xml
Résultat de l'exécution (projet enfant)
> mvn antrun:run
...
[FATAL] Non-resolvable parent POM for example:child:1.0.0: Failure to find example:parent:pom:1.0.0 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced and 'parent.relativePath' points at wrong local POM @ line 6, column 11
@
...
/child/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>child</artifactId>
</project>
Résultat de l'exécution (projet enfant)
> mvn antrun:run
...
[echo] artifactId = child
--Le projet parent a été trouvé et a fonctionné
--Si le POM a une relation parent-enfant, le POM parent sera fusionné dans le POM enfant.
Pom parent.xml
<?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>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<hoge>PARENT</hoge>
<fuga>PARENT</fuga>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>parent/dir</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>hoge = ${hoge}</echo>
<echo>fuga = ${fuga}</echo>
<echo>piyo = ${piyo}</echo>
<echo>dependencies[0].artifactId = ${project.dependencies[0].artifactId}</echo>
<echo>dependencies[1].artifactId = ${project.dependencies[1].artifactId}</echo>
<echo>resources[0].directory = ${project.build.resources[0].directory}</echo>
<echo>resources[1].directory = ${project.build.resources[1].directory}</echo>
<echo>plugins[0] = ${project.build.plugins[0].id}</echo>
<echo>plugins[1] = ${project.build.plugins[1].id}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Enfant pom.xml
<?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>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child</artifactId>
<properties>
<fuga>CHILD</fuga>
<piyo>CHILD</piyo>
</properties>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>child/dir</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeps-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
</project>
--Il hérite du POM parent et décrit de sorte que certains paramètres se chevauchent.
Résultat de l'exécution (projet parent)
> mvn antrun:run
...
[echo] hoge = PARENT
[echo] fuga = PARENT
[echo] piyo = ${piyo}
[echo] dependencies[0].artifactId = commons-lang3
[echo] dependencies[1].artifactId = ${project.dependencies[1].artifactId}
[echo] resources[0].directory = parent/dir
[echo] resources[1].directory = ${project.build.resources[1].directory}
[echo] plugins[0] = org.apache.maven.plugins:maven-antrun-plugin:1.8
[echo] plugins[1] = ${project.build.plugins[1].id}
Résultat de l'exécution (projet enfant)
> mvn antrun:run
...
[echo] hoge = PARENT
[echo] fuga = CHILD
[echo] piyo = CHILD
[echo] dependencies[0].artifactId = commons-codec
[echo] dependencies[1].artifactId = commons-lang3
[echo] resources[0].directory = child/dir
[echo] resources[1].directory = ${project.build.resources[1].directory}
[echo] plugins[0] = org.apache.maven.plugins:maven-antrun-plugin:1.8
[echo] plugins[1] = org.apache.maven.plugins:maven-jdeps-plugin:3.1.2
<properties> <fuga>
etc.) dans le paramètre de valeur unique.<dependencies>
, <plugins>
, etc.) dans le réglage de plusieurs valeurs est basée sur le POM parent et l'élément du POM enfant est ajouté.<build> <resources>
est un élément à valeurs multiples mais est écrasé.<ressources>
<resource>
est censée être fusionnée en plus
--Mais en réalité, c'est une sous-classe de ce ModelMerger
[MavenModelMerger](https://github.com/apache/maven/blob/maven-3.6.3/maven-model-builder/src/main/java/ org / apache / maven / model / merge / MavenModelMerger.java) semble fusionner
--MavenModelMerger
est [mergeBuildBase_Resources ()](https://github.com/apache/maven/blob/maven-3.6.3/maven-model-builder/src/main/java/org/apache/maven/model Redéfinir /merge/MavenModelMerger.java#L381) pour fusionner le contenu du POM parent uniquement si le <ressources>
de la cible
(POM enfant) est vide.<resources>
, devez-vous jeter un œil à cette implémentation de MavenModelMerger
?maven-help-plugin
peut être utilisé.effective-exécuter le but pom
> mvn help:effective-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>example</groupId>
<artifactId>child</artifactId>
<version>1.0.0</version>
(Omis car il est long)
...
--Description des paramètres de plug-in <configurations>
Ce qui suit n'a pas de définition de schéma fixe car les paramètres sont différents pour chaque plug-in.
<configurations>
se fait uniformément selon certaines règles.
--Par exemple, si <exécution>
, la définition est fixée de manière à pouvoir être identifiée par
, vous pouvez donc fusionner le même
. ――Cependant, les balises sous
POM parent
...
<configuration>
<persons>
<person>
<name>Taro</name>
<age>18</age>
</person>
<person>
<name>Hanako</name>
<sex>female</sex>
</person>
</persons>
</configuration>
...
Enfant POM
...
<configuration>
<persons>
<person>
<sex>male</sex>
</person>
<cat>nya-</cat>
<person>
<name>Ayako</name>
<age>15</age>
</person>
<person>
<name>Rin</name>
<age>12</age>
<sex>female</sex>
</person>
</persons>
</configuration>
...
Dans cet état, vérifiez le résultat de la fusion avec help: effective-pom
.
effective-pom
...
<configuration>
<persons>
<person>
<sex>male</sex>
<name>Taro</name>
<age>18</age>
</person>
<cat>nya-</cat>
<person>
<name>Ayako</name>
<age>15</age>
<sex>female</sex>
</person>
<person>
<name>Rin</name>
<age>12</age>
<sex>female</sex>
</person>
</persons>
</configuration>
...
«C'est difficile à expliquer avec des mots, mais vous pouvez voir qu'ils sont fusionnés de manière agréable. «Probablement, s'il y a une balise avec le même nom dans la même position, il semble que le contenu soit fusionné de manière récursive.
«Je pense que même le comportement par défaut fusionnera raisonnablement bien.
POM parent
...
<configuration>
<persons>
<person>
<name>Taro</name>
<age>18</age>
</person>
<person>
<name>Hanako</name>
<sex>female</sex>
</person>
</persons>
</configuration>
...
Enfant POM
...
<configuration>
<persons>
<person combine.self="override">
<sex>male</sex>
</person>
<cat>nya-</cat>
<person combine.children="append">
<name>Ayako</name>
<age>15</age>
</person>
<person>
<name>Rin</name>
<age>12</age>
<sex>female</sex>
</person>
</persons>
</configuration>
...
combile.self =" override "
et combine.children =" append "
effective-pom
...
<configuration>
<persons>
<person combine.self="override">
<sex>male</sex>
</person>
<cat>nya-</cat>
<person combine.children="append">
<name>Hanako</name>
<sex>female</sex>
<name>Ayako</name>
<age>15</age>
</person>
<person>
<name>Rin</name>
<age>12</age>
<sex>female</sex>
</person>
</persons>
</configuration>
...
combine. *
A été ajouté.
--Si vous spécifiez combine.self =" override "
, les éléments du POM parent sont complètement ignorés et seuls les éléments du POM enfant sont utilisés.
--Si combine.children =" append "
est spécifié, l'élément du POM enfant est simplement ajouté à la fin de l'élément du POM parent.combine. *
De la même manière pour les éléments imbriqués.Pom parent.xml
<?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>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>validate</phase>
<goals><goal>run</goal></goals>
<configuration>
<target>
<echo>Hello ${project.artifactId}</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
--Utilisez <pluginManagement>
pour rassembler les définitions de plugin dans le projet parent
Enfant 1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child1</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Enfant 2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child2</artifactId>
</project>
―― Cela n'applique aucun plug-in
Résultat de l'exécution (enfant 1)
> mvn validate
...
[INFO] ---------------------------< example:child1 >---------------------------
[INFO] Building child1 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.8:run (default) @ child1 ---
[INFO] Executing tasks
main:
[echo] Hello child1
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
--Le plug-in est appliqué avec les paramètres définis dans le POM parent.
Résultat de l'exécution (enfant 2)
> mvn validate
...
[INFO] ---------------------------< example:child2 >---------------------------
[INFO] Building child2 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
Pom parent.xml
<?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>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
--Utilisez <dependencyManagement>
pour regrouper les définitions de dépendance dans un parent
<dependencies>
<pluginManagement>
, la définition ici n'est qu'une déclaration, et elle est appliquée individuellement au projet.Enfant 1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child1</artifactId>
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>
</project>
Enfant 2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child2</artifactId>
</project>
Résultat de l'exécution (effectif de l'enfant 1-pom)
> mvn help:effective-pom
...
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
...
--commons-io
est appliqué dans la version définie dans le POM parent
Résultat de l'exécution (effectif de l'enfant 2)-pom)
> mvn help:effective-pom
...
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
...
--La dépendance commons-io
n'est pas appliquée
--La relation parent-enfant était une forme dans laquelle l'enfant renvoyait au parent ―― En revanche, dans le cas de l'agrégation de projets, le parent fait référence à l'enfant. ――Lorsque vous agrégez des projets, vous pouvez spécifier des objectifs et des phases dans le projet parent et les exécuter.
Structure des dossiers
|-pom.xml
`-sub/
`-pom.xml
--Projets dont le dossier supérieur est la source d'agrégation
enfant
Source d'agrégation pom.xml
<?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>example</groupId>
<artifactId>root</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>sub</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>Hello ${project.artifactId}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
<modules>
, listez les projets à agréger avec <module>
Pom à agréger.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>example</groupId>
<artifactId>sub</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>Hello ${project.artifactId}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution (exécuté dans le projet source d'agrégation)
> mvn antrun:run
...
main:
[echo] Hello sub
...
main:
[echo] Hello root
...
--Lorsque vous exécutez l'objectif du plug-in dans le projet source, le même objectif est exécuté dans le projet cible. ――Lorsque vous agrégez des projets de cette manière, les commandes exécutées dans le projet source seront également exécutées dans le projet de destination. ――Il est pratique d'avoir ce mécanisme lorsque vous souhaitez construire tous les projets à la fois.
Structure des dossiers
|-pom.xml
`-child/
`-pom.xml
Pom parent.xml
<?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>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>child</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>Hello ${project.artifactId}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--Il n'y a pas de changement particulier dans la composition du POM parent
Enfant pom.xml
<?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>
<parent>
<groupId>example</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>child</artifactId>
</project>
--Déclarez le projet parent avec `
Résultat de l'exécution (exécuté dans le projet parent)
> mvn antrun:run
...
main:
[echo] Hello parent
...
main:
[echo] Hello child
...
jar
est construit.--Si vous créez un projet qui construit Java normalement, l'empaquetage sera par défaut jar
default
sont:
resources:resources
compiler:compile
resources:testResources
compiler:testCompile
surefire:test
jar:jar
install:install
deploy:deploy
―― Regardez ce que chaque objectif fait un par unmaven-resources-plugin
(https://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html).pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
--Vérifiez avec la configuration minimale pom.xml
Structure des dossiers
|-pom.xml
`-src/main/
|-java/
| `example/
| `-App.java
`-resources/
|-hoge.txt
`-foo/
`-bar.txt
src / main / resources
Exécution de la commande
> mvn resources:resources
...
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ hello ---
...
[INFO] BUILD SUCCESS
--resources: resources
Exécuter les objectifs directement
Structure des dossiers après exécution
|-pom.xml
|-src/main/
| |-java/
| | `example/
| | `-App.java
| `-resources/
| |-hoge.txt
| `-foo/
| `-bar.txt
`-target/classes/
|-hoge.txt
`-foo/
`-bar.txt
src / main / resources
est copié dans le dossier target / classes
.
--maven-resources-plugin
fournit le processus de copie du dossier de ressources du projet dans le dossier de sortie.src / main / resources
cible / classes
$ {project.build.resources}
$ {project.basedir} / src / main / resources
dans Super POM de l'objectif
resources. --Ce paramètre est par défaut
$ {project.build.outputDirectory}--Et cette valeur est définie sur
$ {project.build.directory} / classes` par défaut par Super POM$ {project.basedir} / target
est défini dans $ {project.build.directory}
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<resources>
<resource>
<directory>src/main/hoge</directory>
</resource>
</resources>
</build>
</project>
src / main / hoge
Structure des dossiers
|-pom.xml
`-src/main/
|-hoge/
| |-fizz.txt
| `-hoge/
| `-fuga.txt
|
`-resources/
|-buzz.txt
`-foo/
`-bar.txt
--Il existe deux options, src / main / resources
et src / main / hoge
.
Exécuter l'objectif des ressources
> mvn resources:resources
...
Résultat d'exécution
|-pom.xml
|-src/main/
| |-hoge/
| | |-fizz.txt
| | `-hoge/
| | `-fuga.txt
| |
| `-resources/
| |-buzz.txt
| `-foo/
| `-bar.txt
|
`-target/classes/
|-fizz.txt
`-hoge/
`-fuga.txt
--src / main / hoge
Il a changé de sorte que seul ce qui suit est copié
resources: resources
fonctionne par défaut comme suit:$ {project.basedir} / src / main / resources
sous $ {project.basedir} / target / classes
<projet> <build> <resources>
<project> <build> <outputDirectory>
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
--Vérifiez avec la configuration minimale POM
Structure des dossiers
|-pom.xml
`-src/main/java
`-example/
`-Hello.java
--Configuration simple avec seulement Hello.java
Exécuter l'objectif de compilation
> mvn compiler:compile
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-cli) @ hello ---
...
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR]L'option source 5 n'est actuellement pas prise en charge. Veuillez utiliser 6 ou une version ultérieure.
[ERROR]Option cible 1.5 n'est actuellement pas pris en charge. 1.Veuillez utiliser 6 ou une version ultérieure.
-source
et -target
sont [ne peuvent pas être spécifiées](https://docs.oracle.com/javase/jp/11/migrate/index.html# JSMIG-GUID-77874D97-46F3-4DB5-85E4-2ACB5F8D760B)
--Si l'empaquetage est jar
, la version par défaut de maven-compiler-plugin
est [3.1](https://maven.apache.org/ref/3.6.3/maven- core / default-bindings.html # Plugin_bindings_for_jar_packaging)
--Dans 3.1 de maven-compiler-plugin
, la spécification de version de -source
et de -target
est [1.5] par défaut (https://github.com/apache/maven-compiler- plugin / blob / maven-compiler-plugin-3.1 /src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java#L120)maven-compiler-plugin
au moment de la confirmation, [1.6](https://github.com/apache/maven-compiler-plugin/blob/maven-compiler-plugin-3.8. 1 / src / main / java / org / apache / maven / plugin / compiler / AbstractCompilerMojo.java # L100) est la valeur par défaut
--Ainsi, pour éliminer cette erreur, vous devez augmenter la version de maven-compiler-plugin
ou augmenter la spécification de source
et de cible
.
--Il est sûr de spécifier les deux pour confirmer l'opération.pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
source
avec maven-compiler-plugin
, utilisez paramètre source. Ensemble
--Bien qu'il puisse être spécifié avec <configuration>
, il peut également être spécifié avec la propriété maven.compiler.source
.target
, qui peut être définie avec la propriété maven.compiler.target
.Résultat d'exécution
> mvn compiler:compile
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-cli) @ hello ---
...
[WARNING] File encoding has not been set, using platform encoding MS932, i.e. build is platform dependent!
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
$ {project.build.sourceEncoding}
--Cependant, cette valeur n'est pas définie dans Super POM, il en résulte donc un environnement par défaut (tel que MS932 pour Windows).pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
--De la description $ {project.build.sourceEncoding}
, vous pouvez penser que vous devriez décrire l'élément <sourceEncoding>
sous <project> <build>
, mais en réalité, vous déclarez la propriété ( Qui sait </ del>)
Au fait, il est possible de le définir avec la propriété ʻencoding, mais si vous le recherchez sur le net, la méthode de
project.build.sourceEncoding` sera interceptée.
――S'il s'agit d'un «encodage», il peut être appliqué à des encodages autres que la source Java, ou existe-t-il une telle chose? (adapté)
Résultat d'exécution
> mvn compiler:compile
...
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-cli) @ hello ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Résultat de sortie
|-pom.xml
|-src/main/java/
| :
`-target/
|-classes/
: `-example/
`-Hello.class
target / classes
compile
[outputDirectory](https://github.com/apache/maven-compiler-plugin/blob/maven-compiler-plugin-3.8.1/src/main/java /org/apache/maven/plugin/compiler/CompilerMojo.java#L76) Déclaré dans le champ$ {project.build.outputDirectory}
--Depuis que readonly = true
est défini, ce champ ne peut pas être défini directement de l'extérieur.src / main / java
defaultValue
, vous pouvez voir que$ {project.compileSourceRoots} est défini. --Mais quand j'essaye de référencer cette propriété appelée
project.compileSourceRoots sur pom.xml, je ne vois pas la valeur. --
compileSourceRoots` est [MavenProject](https://github.com/apache/maven/blob/maven-3.6.3/maven-core/src/main/java/org/apache/maven/project/MavenProject.java # L131) Déclaré comme champ de classe
--Ce champ est DefaultProjectBuilder La valeur est définie par # L691)project.build.sourceDirectory
est défini sur compileSourceRoots
.
--Et $ {project.basedir} / src / main / java
est défini dans project.build.sourceDirectory
par Super POM.
――Si vous regardez ce mécanisme, vous pouvez vous attendre à ne pas pouvoir définir plusieurs dossiers source.compiler: compile
fait ce qui suit:
--Compilez le code source Java sous $ {project.basedir} / src / main / java
et sortez-le dans $ {project.basedir} / target / classes
Les options -source
, -target
de --javac peuvent être spécifiées avec les propriétés maven.compiler.source
, maven.compiler.target
project.build.sourceEncoding
.<project> <build> <sourceDirectory>
build-helper-maven-plugin
<project> <build> <outputDirectory>
resources: resources
, compiler: compile
, donc seulement approximativementStructure des dossiers
|-pom.xml
`-src/test/
|-java/
| `-example/
| `-HelloTest.java
|
`-resources/
|-foo/
| `-bar.txt
`-fizz.txt
src / test / java
,
Placez les fichiers de ressources de test sous src / test / resources
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
--pom.xml est le même que pour compiler: compile
Courir
> mvn resources:testResources compiler:testCompile
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-cli) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-cli) @ hello ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
Résultat d'exécution
|-pom.xml
|-src/test/
| :
`-target/
`-test-classes/
|-fizz.txt
|-foo/
| `-bar.txt
`-example/
`-HelloTest.class
target / test-classes
――Une fois organisé, l'opération est la suivante.
testResources
est de copier les fichiers et dossiers sous $ {project.basedir} / src / test / resources
dans $ {project.basedir} / target / test-classes
.<project> <build> <testResources>
testCompile
compile les fichiers source Java sous $ {project.basedir} / src / test / java
et les renvoie dans $ {project.basedir} / target / test-classes
.<projet> <build> <testSourceDirectory>
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.6.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
</project>
junit-jupiter
aux dépendancesmaven-surefire-plugin
--2.22.0 ou supérieur doit être spécifié pour utiliser JUnit5Structure des dossiers
|-pom.xml
`-src/
|-main/java/
| `-example/
| `-Hello.java
`-test/java/
`-example/
`-HelloTest.java
--Placez la classe cible de test (Hello.java
) et la classe de test ( HelloTest.java
)
Courir
> mvn test
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ hello ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running example.HelloTest
...
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s - in example.HelloTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
> dir /b target\surefire-reports
example.HelloTest.txt
TEST-example.HelloTest.xml
--L'objectif surefire: test
est lié à la phase test
, il est donc exécuté avec la phase test
spécifiée.
--Il est possible d'exécuter surefire: test
seul, mais dans ce cas, la source doit être compilée séparément.
**/Test*.java
**/*Test.java
**/*Tests.java
**/*TestCase.java
target / surefire-reports
surefire: test
paramètre reportsDirectory (la valeur par défaut est $ {project.build.directory} / surefire-reports
)--Après la phase test
, la phase package
est exécutée, ce qui fige le résultat de la compilation du projet dans un fichier jar.
test
doit se terminer avec succès pour générer un fichier jar.test
, la phase package
ne fonctionnera pasRésultat d'exécution
> mvn -DskipTests package
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello ---
[INFO] Tests are skipped.
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello ---
...
--surefire: test
Le but a un paramètre appelé skipTests.
--Si ce paramètre est défini, l'exécution du test sera ignorée.
test
effectue les opérations suivantes:maven-surefire-plugin
maven-surefire-plugin
doit être 2.22.0 ou supérieure.target / surefire-reports
(paramètre reportsDirectory" )--Le processus de solidification du résultat de la compilation dans un fichier jar est le [but du jar](https: //maven.apache) de maven-jar-plugin. .org / plugins / maven-jar-plugin / jar-mojo.html)
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
Structure des dossiers
|-pom.xml
`-src/
|-test/
| :
`-main/
|-java/
| `-example/
| `-Hello.java
`-resources/
`-hoge.txt
Phase d'exécution du package
> mvn package
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ hello ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello ---
...
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ hello ---
...
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ hello ---
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
--L'objectif jar: jar
est lié à la phase package
, vous exécutez donc la phase package
.
Résultat d'exécution
|-pom.xml
|-src/
| :
`-target/
|-hello-1.0.0.jar
:
--hello-1.0.0.jar
est affiché directement sous le dossier target
.
$ {project.build.directory}
($ {project.basedir} / target
)readonly = true
, il ne peut donc pas être modifié directement de l'extérieur.
--La valeur de ce champ est définie sur $ {project.build.finalName}
--Cette valeur est définie par Super POM sur $ {project.artifactId} - $ {project.version}
par défaut.
--Par conséquent, si vous souhaitez renommer le jar, vous pouvez définir <project> <build> <finalName>
text:hello-1.0.0.Contenu du pot
|-hoge.txt
|-example/
| `-Hello.class
`-META-INF/
|-MANIFEST.MF
`-maven/example/hello/
|-pom.properties
`-pom.xml
--hoge.txt
et Hello.class
sont emballés avec la sortie sous target / classes
par resources: resources
et compiler: compile
, respectivement.
$ {project.build.outputDirectory}
($ {project.basedir} / target / classes
)
--Pom.xml est affiché sous META-INF
, mais le contenu est le même que pom.xml de ce projet.
--MANIFEST.MF
et pom.properties
ont respectivement le contenu suivant.MANIFEST.MF
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: xxxxx
Build-Jdk: 11.0.6
pom.properties
#Generated by Maven
#Sun Mar 29 21:59:48 JST 2020
groupId=example
artifactId=hello
version=1.0.0
jar
fonctionne comme ceci:${project.artifactId}-${project.version}
--Spécifiez avec <projet> <build> <finalName>
pour changer${project.basedir}/target
--Spécifiez avec <projet> <build> <directory>
pour changer${project.basedir}/target/classes
--Si vous souhaitez le modifier, spécifiez-le avec le paramètre <project> <build> <outputDirectory>
ou classesDirectory
de l'objectif jar
.peut être utilisé pour définir les informations ajoutées sous
MANIFEST.MF et
META-INF`.--ʻInstall` Le [objectif d'installation](https: // maven.) De maven-install-plugin associé à la phase. apache.org/plugins/maven-install-plugin/install-mojo.html) offre la possibilité d'installer des artefacts de projet dans un référentiel local.
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
...
</project>
Lancer l'installation
> mvn install
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
--ʻInstall: install L'objectif est lié à la phase ʻinstall
, donc vous exécutez la phase ʻinstall` (déroutant)
--Lorsque l'exécution est terminée, vérifiez dans le référentiel local
% USERPROFILE% \ .m2 \ repository
sous Windows ( $ HOME / .m2 / repository
sous Linux OS)
--Si vous avez spécifié un emplacement différent dans settings.xml
, celaDépôt local
Dépôt local/
|-example/
: `-hello/
|-1.0.0/
: |-hello-1.0.0.jar
:
package
--ʻInstall: installLe document d'objectif indiquait "l'artefact principal du projet", mais je n'ai pas pu trouver une description claire de ce qui serait "l'artefact principal du projet". --En termes de mise en œuvre, [MavenProject getArtifact ()](https://github.com/apache/maven/blob/maven-3.6.3/maven-core/src/main/java/org/apache/maven/project [Artifact getFile ()](https://github.com/apache/maven/blob/maven-3.6.3/maven-artifact/src/main/java/org/) qui peut être obtenu avec /MavenProject.java#L215) Je pourrais lire jusqu'au point où le fichier qui peut être obtenu par apache / maven / artifact / Artifact.java # L85) semble être installé, mais je n'ai pas pu trouver l'endroit où cet objet
File` est placé.pom.xml
<?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>example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
--Déclarer les dépendances sur hello-1.0.0.jar
avec <dependencies>
Foo.java
package example;
public class Foo {
public static void main(String... args) {
new Hello().hello();
}
}
Hello
Compilez le projet
> mvn compile
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ foo ---
...
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ foo ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
--Compilé (la classe Hello
a été résolue)
package
dans votre référentiel localdeploy
, l 'objectif de déploiement de maven-deploy-plugin plugins / maven-deploy-plugin / deploy-mojo.html) est exécutéVoyez comment votre projet se construit si vous définissez --packaging sur war
default
est presque le même que dans le cas de jar
.jar
est que le but exécuté dans la phase package
est war war goalStructure des dossiers
|-pom.xml
`-src/main/
|-java/
| `-example/webapp/
| `-HelloServlet.java
`-webapp/
`-WEB-INF/
`-hello.jsp
--Créez un dossier appelé src / main / webapp
, et créez des dossiers sous celui-ci tels que WEB-INF
à inclure dans war
.
pom.xml
<?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>example</groupId>
<artifactId>webapp</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
</project>
--war
est spécifié pour<packaging>
--Les deux suivants sont spécifiés comme dépendances
- Servlet API
- Apache Commons Lang3
Construire
> mvn package
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ webapp ---
...
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ webapp ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ webapp ---
...
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ webapp ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ webapp ---
...
[INFO] --- maven-war-plugin:3.2.3:war (default-war) @ webapp ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Résultat de sortie
|-pom.xml
|-src/
| :
`-target/
`-webapp-1.0.0.war
target
war
(https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#outputDirectory) et par défaut à$ C'est {project.build.directory}
--Le nom du fichier war est [warName](https://github.com/apache/maven-war-plugin/blob/maven-war-plugin-3.2.3/src/main/java/org/apache/ Il est spécifié par un paramètre en lecture seule appelé maven / plugins / war / WarMojo.java # L71) et vaut par défaut $ {project.build.finalName}
.webapp-1.0.0.war
est le suivanttext:webapp-1.0.0.Le contenu de la guerre
webapp-1.0.0.war/
|-WEB-INF/
| |-hello.jsp
| |-classes/
| | `-example/webapp/
| | `-HelloServlet.class
| `-lib/
| `-commons-lang3-3.10.jar
`-META-INF/
|-MANIFEST.MF
`-maven/example/webapp/
|-pom.properties
`-pom.xml
src / main / java
et le contenu sous src / main / webapp
sont contenus dans le fichier war.src / main / webapp
.war
(https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#warSourceDirectory) et par défaut à $ { basedir} / src / main / webapp
WEB-INF / lib
.war
, le projet sera construit comme suit:jar
war: war
est exécuté uniquement dans la phase package
est différent du cas de jar
.
--Dans le but war: war
, le résultat de la compilation du projet est sorti dans un fichier war.
--En plus du fichier de classe, de la ressource et de la bibliothèque dépendante, le fichier placé sous src / main / webapp
est également stocké dans la guerre tel quel.Hello.java
package example;
import java.util.Arrays;
public class Hello {
public static void main(String... args) {
System.out.println("Hello World! args=" + Arrays.toString(args));
}
}
--Hello World, implémentation qui génère des arguments de ligne de commande
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<mainClass>example.Hello</mainClass>
<arguments>
<argument>one</argument>
<argument>two</argument>
<argument>three</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Courir
> mvn compile exec:java
...
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello ---
Hello World! args=[one, two, three]
...
--Hello.java
a été exécuté
--Si vous utilisez le but java de ʻexec-maven-plugin, vous pouvez mettre le résultat de la construction du projet dans le chemin de classe. Peut exécuter des programmes Java --ʻExec-maven-plugin
a également un objectif d'exécution qui vous permet d'exécuter des commandes arbitraires. Omis ici
commandlineArgs
, mais ceci est à utiliser lors de l'exécution à partir de la ligne de commande décrite plus tard (probablement).pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<mainClass>example.Hello</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
--Il est difficile de spécifier la classe Main à partir de la ligne de commande, donc je pense que seul cela peut être décrit à l'avance dans pom.xml.
Résultat d'exécution
> mvn compile exec:java -Dexec.args="ONE TWO THREE"
...
Hello World! args=[ONE, TWO, THREE]
compile
indique qu'elle est toujours utilisée à partir du moment où le code source est compilé jusqu'au moment où l'application est exécutée.test
indique qu'elle ne doit être utilisée que lors de la compilation du code de test ( src / test / java
) et de l'exécution du test.
--Il existe 6 types de portées comme suit.
compile
provided
runtime
test
system
import
pom.xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
compile
est adoptée par défaut (elle peut être spécifiée).compile
indique que la dépendance est toujours requise de la compilation à l'exécution.pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
provided
indique que la dépendance est fournie par l'environnement d'exécution.provided
.maven-war-plugin
, les dépendances spécifiées dans provided
ne sont pas placées sous WEB-INF / lib
.pom.xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.12</version>
<scope>runtime</scope>
</dependency>
runtime
est l'opposé de provided
et est utilisée avec des dépendances qui ne sont pas nécessaires au moment de la compilation mais qui sont nécessaires au moment de l'exécution.pom.xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.6.1</version>
<scope>test</scope>
</dependency>
test
est utilisée pour les dépendances qui ne sont utilisées que lors de la compilation et de l'exécution de la source de test.pom.xml
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
system
indique que la dépendance est fournie par le système (JRE ou JDK de l'environnement d'exécution).system
, vous devez spécifier le chemin du fichier jar cible avec <systemPath>
.Structure des dossiers
|-foo/
| `-pom.xml
`-bar/
`-pom.xml
--Il y a deux projets, toto et bar
pom.xml(foo)
<?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>example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
pom
et déclare uniquement <dependencyManagement>
org.apache.commons:commons-lang3:3.10
org.apache.commons:commons-text:1.8
pom.xml(bar)
<?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>example</groupId>
<artifactId>bar</artifactId>
<version>1.0.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
--Dans le projet de barre, dans <dependencyManagement>
, le projet foo précédent est spécifié dans la portée ʻimport. --ʻImport
La portée ne peut être spécifiée que dans <dependencyManagement>
--Si vous spécifiez la portée ʻimport, vous devez également spécifier le
. --En outre, les deux suivants sont déclarés comme d'autres objets dépendants. -
org.apache.commons:commons-lang3:3.9 -
org.apache.commons:commons-csv:1.8`
effective-Confirmation de pom(bar)
> cd bar
> mvn help:effective-pom
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</dependencyManagement>
artifactId | foo | bar | effective-pom |
---|---|---|---|
commons-lang3 |
3.10 |
3.9 |
3.9 |
commons-csv |
- | 1.8 |
1.8 |
commons-text |
1.8 |
- | 1.8 |
<dependencyManagement> '' du projet foo ont été ajoutées. --Cependant, si les artefacts sont dupliqués, la version du projet de barre est adoptée (
commons-lang3`).a une portée spéciale pour importer (importer)
BOM --Il existe une méthode appelée ** BOM (nomenclature) ** qui utilise la portée ʻimport` comme méthode de gestion des versions de dépendance pour les multi-projets. --Pour la nomenclature, préparez d'abord un projet de nomenclature avec pom.xml.
groupId
, ʻartifactId dans
war: war
, cela signifie s'il sera emballé dans le fichier war généré.
--Autre que cela, cela signifie s'il est défini ou non dans le chemin de classe.pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
</project>
--Déclarer le Web Spring Framework et jdbc en tant que dépendances «Cependant, les bibliothèques dont dépend le projet ne sont pas limitées à cela, et en fait, elles dépendent également des bibliothèques dont dépendent« spring-web »et« spring-jdbc ».
Résultat d'exécution
> mvn dependency:tree
...
[INFO] +- org.springframework:spring-web:jar:5.2.5.RELEASE:compile
[INFO] | +- org.springframework:spring-beans:jar:5.2.5.RELEASE:compile
[INFO] | \- org.springframework:spring-core:jar:5.2.5.RELEASE:compile
[INFO] | \- org.springframework:spring-jcl:jar:5.2.5.RELEASE:compile
[INFO] \- org.springframework:spring-jdbc:jar:5.2.5.RELEASE:compile
[INFO] \- org.springframework:spring-tx:jar:5.2.5.RELEASE:compile
...
spring-jdbc
dépend de spring-tx
spring-jdbc
dépend également de spring-beans
et de spring-core
, mais l'affichage est omis car il chevauche le côté spring-web
.
--Par défaut, les dépendances de toutes les étendues sont affichées, mais vous pouvez également affiner par paramètre de portée. ça peutmaven-dependency-plugin
.
-Essayez d'exécuter avec les mêmes paramètres que pom.xml dans ↑Résultat d'exécution
> mvn dependency:copy-dependencies
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
> dir /b target\dependency
spring-beans-5.2.5.RELEASE.jar
spring-core-5.2.5.RELEASE.jar
spring-jcl-5.2.5.RELEASE.jar
spring-jdbc-5.2.5.RELEASE.jar
spring-tx-5.2.5.RELEASE.jar
spring-web-5.2.5.RELEASE.jar
target / dependency
--Par défaut, les fichiers JAR de toutes les étendues sont ciblés, mais limités par paramètre includeScope etc. être capable depom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<profiles>
<profile>
<id>foo</id>
<properties>
<message>foo profile!!</message>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
</dependencies>
<build>
<directory>${project.basedir}/build</directory>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>message = ${message}</echo>
<echo>project.build.directory = ${project.build.directory}</echo>
<echo>dependency[0] = ${project.dependencies[0].artifactId}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--<profiles> <profile>
déclare un profil appelé foo
--Dans le profil foo
, les propriétés, les dépendances et les paramètres project.build.directory
sont définis.
maven-antrun-plugin
pour afficher ces valeurs.Résultat d'exécution
> mvn antrun:run
...
[echo] message = ${message}
[echo] project.build.directory = F:\tmp\maven\hello\target
[echo] dependency[0] = ${project.dependencies[0].artifactId}
...
> mvn -P foo antrun:run
...
[echo] message = foo profile!!
[echo] project.build.directory = F:\tmp\maven\hello\build
[echo] dependency[0] = commons-lang3
foo
n'est pas reflété.-P foo
et que vous l'exécutez, vous pouvez voir que le contenu défini dans le profil foo
est reflété.<profile> '' --Définissez un nom pour identifier de manière unique le profil avec
<dependencies>
, <build>
, etc.) tels qu'ils sont.
--Pour spécifier le profil, spécifiez «-P» suivi de «pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>foo</id>
<properties>
<foo>FOO</foo>
<message>foo profile!!</message>
</properties>
</profile>
<profile>
<id>bar</id>
<properties>
<bar>BAR</bar>
<message>bar profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<echo>foo = ${foo}</echo>
<echo>bar = ${bar}</echo>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--Déclarer deux profils, foo
et bar
--message
est déclaré dans les deux profils pour le dupliquer
Résultat d'exécution
> mvn -P bar,foo antrun:run
...
[echo] foo = FOO
[echo] bar = BAR
[echo] message = bar profile!!
--Lors de la spécification de plusieurs profils, listez les «id» séparés par des virgules.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>foo</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<message>foo profile!!</message>
</properties>
</profile>
<profile>
<id>bar</id>
<properties>
<message>bar profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
...
<configuration>
<target>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--Le profil foo
est défini sur <activeByDefault> true </ activeByDefault>
Résultat d'exécution
> mvn antrun:run
...
[echo] message = foo profile!!
...
> mvn -P bar antrun:run
...
[echo] message = bar profile!!
foo
est activée par défaut
--Si vous définissez <activation> <activeByDefault>
sur true
, le profil sera activé par défaut.
--Si un profil différent est spécifié avec -P
, le profil avec <activeByDefault> ʻis
true` sera invalide.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>foo</id>
<activation>
<property>
<name>foo</name>
</property>
</activation>
<properties>
<message>foo profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
...
<configuration>
<target>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--Déclarer <propriété>
dans <activation>
Résultat d'exécution
> mvn antrun:run
...
[echo] message = ${message}
...
> mvn -Dfoo antrun:run
...
[echo] message = foo profile!!
--Le profil n'est pas spécifié par -P
, mais le profil foo
est activé en déclarant la propriété système avec -Dfoo
.
--Dans <activation>
, vous pouvez définir les conditions pour activer le profil.
--<propriété>
peut être spécifié à la condition qu'une propriété système soit déclarée ou qu'une valeur spécifique soit définie.
<nom> foo </ nom>
est défini, donc si la propriété système foo
est définie, le profil sera valide quelle que soit la valeur.
--Si la valeur est également une condition, déclarez <valeur>
comme suit:Lorsque la valeur de la propriété système est également incluse dans la condition
<property>
<name>foo</name>
<value>enable</value>
</property>
Résultat d'exécution
> mvn -Dfoo antrun:run
...
[echo] message = ${message}
...
> mvn mvn -Dfoo=enable antrun:run
...
[echo] message = foo profile!!
foo
est activé uniquement lorsque la valeur de la propriété système foo
est ʻenable`.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>jdk11</id>
<activation>
<jdk>11</jdk>
</activation>
<properties>
<message>jdk11 profile!!</message>
</properties>
</profile>
<profile>
<id>jdk14</id>
<activation>
<jdk>14</jdk>
</activation>
<properties>
<message>jdk14 profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
...
<configuration>
<target>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
<jdk>
dans <activation>
Résultat d'exécution
> java --version
openjdk 11.0.6 2020-01-14
...
> mvn antrun:run
...
[echo] message = jdk11 profile!!
...
> java --version
openjdk 14 2020-03-17
...
> mvn antrun:run
...
[echo] message = jdk14 profile!!
<jdk>
pour faire de la version Java au moment de l'exécution une condition pour l'application de profil.
--La condition décrite dans <jdk>
correspond au préfixe et est comparée à la version Java.(, 11]
(dans ce cas, elle correspond à 11 ou versions inférieures)java.version
est utilisée pour la version Java à comparer.!
, Comme <jdk>! 11 </ jdk>
.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>Windows</id>
<activation>
<os>
<name>Windows 10</name>
</os>
</activation>
<properties>
<message>Windows profile!!</message>
</properties>
</profile>
<profile>
<id>Linux</id>
<activation>
<os>
<name>Linux</name>
</os>
</activation>
<properties>
<message>Linux profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
...
<configuration>
<target>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--<activation>
est réglé sur<os>
Résultat d'exécution(Windows)
> mvn antrun:run
...
[echo] message = Windows profile!!
Résultat d'exécution(Linux)
> mvn antrun:run
...
[echo] message = Linux profile!!
<os>
permet au système d'exploitation d'être utilisé comme condition pour l'application de profil au moment de l'exécution
--<nom>
est conditionnel au nom du système d'exploitation<family>
<arch>
<version>
Résultat d'exécution
> mvn enforcer:display-info
...
[INFO] Maven Version: 3.6.3
[INFO] JDK Version: 11.0.6 normalized as: 11.0.6
[INFO] OS Info: Arch: amd64 Family: windows Name: windows 10 Version: 10.0
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>Exists</id>
<activation>
<file>
<exists>${basedir}/pom.xml</exists>
</file>
</activation>
<properties>
<message>Exists profile!!</message>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
...
<configuration>
<target>
<echo>message = ${message}</echo>
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
--<activation>
spécifie<file>
Résultat d'exécution
> mvn antrun:run
...
[echo] message = Exists profile!!
<fichier>
pour utiliser la présence ou l'absence d'un fichier comme condition d'application d'un profil.
--<existe>
est défini à condition que le fichier existe
--Utilisez <missing>
si la condition est que le fichier n'existe pas
--Dans la spécification du chemin de fichier, le paramètre intégré est $ {basedir}
ou propriété système / propriété de requête? Il y a une limitation qu'il ne peut être utilisé$ {project.basedir} / pom.xml
, cela ne sera pas bien jugé.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<profiles>
<profile>
<id>foo</id>
<properties>
<message>foo profile!!</message>
</properties>
</profile>
<profile>
<id>bar</id>
<properties>
<message>bar profile!!</message>
</properties>
</profile>
</profiles>
...
</project>
--foo
, bar
, deux profils sont définis
Résultat d'exécution
> mvn help:all-profiles
...
[INFO] Listing Profiles for Project: example:hello:jar:1.0.0
Profile Id: bar (Active: false , Source: pom)
Profile Id: foo (Active: false , Source: pom)
Résultat d'exécution
> mvn -P foo help:active-profiles antrun:run
...
Active Profiles for Project 'example:hello:jar:1.0.0':
The following profiles are active:
- foo (source: example:hello:1.0.0)
...
[echo] message = foo profile!!
--Utilisez active-profiles pour voir quels profils sont actifs à l'exécution. ça peut ――Il peut être utile lors du débogage
ou de
com.codehaus.mojo` ne répondent pas à vos objectifs, vous devrez créer les vôtres.Hello World
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
<packaging>maven-plugin</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.6.0</version>
</plugin>
</plugins>
</build>
</project>
--Définissez le packaging sur maven-plugin
--Définissez les deux suivants comme dépendances
- org.apache.maven:maven-plugin-api
- org.apache.maven.plugin-tools:maven-plugin-annotations
fournie --Réglage de
maven-plugin-plugin`
--Lorsque vous essayez de compiler avec Java 11, il semble que vous obtiendrez une erreur à moins que vous ne mettiez à jour la version de ce plug-in.HelloMojo.java
package example;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
public void execute() throws MojoExecutionException {
getLog().info("Hello Custom Plugin!");
}
}
--ʻAbstractMojoCréer une classe en héritant de la classe --Cette classe
HelloPlugincorrespond à un objectif ―― Implémentez le traitement du plug-in dans la méthode execute ()
@ Mojo
.
--name
devient le nom de l'objectifConstruire
> mvn install
...
―― Exécutez la phase ʻinstall` pour installer le plugin créé dans votre référentiel local
pom.xml(Autres projets)
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
</plugin>
</plugins>
</build>
</project>
--Le hello-maven-plugin
est réglé sur <plugin>
Résultat d'exécution
> mvn hello:hello
...
[INFO] Hello Custom Plugin!
pom.xml
...
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
...
de votre propre plug-in sur
XXX-maven-plugin. --Si vous définissez ʻartifactId
sur ce modèle, la méta définition sera automatiquement créée avec la partie XXX
comme préfixe du plug-in.Contenu du pot
hello-1.0.0.jar/
|-example/
`-META-INF/
|-MANIFEST.MF
`-maven/
|-example/
`-plugin.xml
plugin.xml
, il ressemble à ceci:plugin.xml
...
<plugin>
<name>hello-maven-plugin</name>
<description></description>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
<goalPrefix>hello</goalPrefix>
<isolatedRealm>false</isolatedRealm>
<inheritedByDefault>true</inheritedByDefault>
...
--<goalPrefix>
est maintenant bonjour
bonjour: <objectif>
appelé
foo-maven-plugin, le préfixe est
foo`.Mojo
HelloMojo.java
package example;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
@Parameter
private String message;
public void execute() throws MojoExecutionException {
getLog().info("message = " + message);
}
}
message
à Mojo et annotation avec @ Parameter
--Getter et Setter ne sont pas définispom.xml(Un autre projet)
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<message>Hello World!!</message>
</configuration>
</plugin>
</plugins>
</build>
</project>
--<configuration>
déclare le même élément que le nom du champ Mojo
Résultat d'exécution
> mvn hello:hello
...
[INFO] message = Hello World!!
message
déclaré dans Mojo peut maintenant être spécifié comme paramètre.HelloMojo.java
package example;
...
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
@Parameter(property="hello.message")
private String message;
public void execute() throws MojoExecutionException {
getLog().info("message = " + message);
}
}
--Définissez property
of @ Parameter
sur le nom spécifié dans les propriétés système.
pom.xml (projet séparé)
...
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
</plugin>
...
--Ne spécifiez pas <configuration>
(s'il est défini, cela aura priorité)
Résultat d'exécution
> mvn hello:hello -Dhello.message="HELLO WORLD!!"
...
[INFO] message = HELLO WORLD!!
HelloMojo.java
package example;
...
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
@Parameter(property="hello.message", defaultValue="Hello Custom Plugin!!")
private String message;
public void execute() throws MojoExecutionException {
getLog().info("message = " + message);
}
}
@ Parameter`` defaultValue
peut déclarer la valeur par défaut pour ce paramètre.pom.xml(Un autre projet)
...
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
</plugin>
...
--<configuration>
n'est pas configuré
Résultat d'exécution
> mvn hello:hello
...
[INFO] message = Hello Custom Plugin!!
...
> mvn hello:hello -Dhello.message=OVERRIDE!!
...
[INFO] message = OVERRIDE!!
--Si rien n'est défini, vous pouvez voir que la valeur définie dans defaultValue
est adoptée.
HelloMojo.java
package example;
...
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
@Parameter(defaultValue="${hello.mojo.message}")
private String message;
public void execute() throws MojoExecutionException {
getLog().info("message = " + message);
}
}
--La valeur de defaultValue
peut être décrite comme $ {...}
<properties>
)pom.xml(Un autre projet)
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
<hello.mojo.message>Project Property</hello.mojo.message>
</properties>
<build>
<plugins>
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
</plugin>
</plugins>
</build>
</project>
--Déclarer une valeur dans <properties>
avec la même clé que celle déclarée dans l'expression defaultValue
Résultat d'exécution
> mvn hello:hello
...
[INFO] message = Project Property
...
> mvn hello:hello -Dhello.mojo.message="System Property"
...
[INFO] message = System Property
--La valeur déclarée dans <properties>
est définie dans le paramètre messge
--Peut également être remplacé par les propriétés système
String
HelloMojo.java
package example;
import java.io.File;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@Mojo(name="hello")
public class HelloMojo extends AbstractMojo {
@Parameter
private int intValue;
@Parameter
private long longValue;
@Parameter
private boolean booleanValue;
@Parameter
private double doubleValue;
@Parameter
private Date dateValue;
@Parameter
private File fileValue;
@Parameter
private URL urlValue;
@Parameter
private HelloEnum enumValue;
@Parameter
private List<String> listValues;
@Parameter
private Map<String, String> mapValue;
public void execute() throws MojoExecutionException {
Log log = getLog();
log.info("intValue=" + intValue);
log.info("longValue=" + longValue);
log.info("booleanValue=" + booleanValue);
log.info("doubleValue=" + doubleValue);
log.info("dateValue=" + dateValue);
log.info("fileValue=" + fileValue);
log.info("urlValue=" + urlValue);
log.info("enumValue=" + enumValue);
log.info("listValues=" + listValues);
log.info("mapValue=" + mapValue);
}
public enum HelloEnum {
HELLO,
WORLD;
}
}
pom.xml(Un autre projet)
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<intValue>123</intValue>
<longValue>1234567890</longValue>
<booleanValue>true</booleanValue>
<doubleValue>1234.5678</doubleValue>
<dateValue>2019-10-20 12:13:14</dateValue>
<fileValue>foo/bar</fileValue>
<urlValue>https://www.google.co.jp/</urlValue>
<enumValue>HELLO</enumValue>
<listValues>
<aaa>fizz</aaa>
<bbb>buzz</bbb>
</listValues>
<mapValue>
<foo>FOO</foo>
<bar>BAR</bar>
</mapValue>
</configuration>
</plugin>
</plugins>
</build>
</project>
Résultat d'exécution
> mvn hello:hello
...
[INFO] intValue=123
[INFO] longValue=1234567890
[INFO] booleanValue=true
[INFO] doubleValue=1234.5678
[INFO] dateValue=Sun Oct 20 12:13:14 JST 2019
[INFO] fileValue=F:\tmp\maven\hello\foo\bar
[INFO] urlValue=https://www.google.co.jp/
[INFO] enumValue=HELLO
[INFO] listValues=[fizz, buzz]
[INFO] mapValue={bar=BAR, foo=FOO}
...
,
long,
float,
double,
boolean` peuvent être utilisés normalementjava.util.Date
est spécifié dans l'un des formats suivants
--yyyy-MM-dd HH: mm: ss.S a
(Exemple: 2005-10-06 2:22: 55.1 PM
)
--yyyy-MM-dd HH: mm: ssa
(Exemple: 2005-10-06 2:22:55 PM
)
――Cependant, même s'ils ne correspondent pas exactement, ils peuvent être analysés de manière flexible (AM et PM peuvent être omis, mais l'heure ne peut pas être omise).
--java.io.File
traite la valeur comme un chemin
--java.net.URL
traite la valeur comme une URLList
, si vous énumérez des éléments avec des noms arbitraires en écrivant le même élément que le nom du paramètre, il semble qu'il sera traité comme un élément de List
.<listValues> <listValue> ...
Map
, le nom de l'élément imbriqué est la clé et la valeur de l'élément est la valeur.
--Bien que la vérification soit omise, java.util.Properties
peut être utilisé de la même manière.HelloMojo.java
package example;
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;
@Mojo(name="hello", defaultPhase=LifecyclePhase.VALIDATE)
public class HelloMojo extends AbstractMojo {
public void execute() throws MojoExecutionException {
getLog().info("Hello Mojo!!");
}
}
defaultPhase
of @ Mojo
--Utilisez le type d'énumération LifecyclePhase
pour spécifier la phase
--Ici, il est lié à la phase valider
pom.xml(Un autre projet)
...
<plugin>
<groupId>example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<goals>
<goal>hello</goal>
</goals>
</execution>
</executions>
</plugin>
...
--hello
Seul le but est déclaré et les phases ne sont pas liées.
Résultat d'exécution(Un autre projet)
> mvn validate
...
[INFO] Hello Mojo!!
--L'objectif «hello» est en cours d'exécution lors de l'exécution de la phase de «validation».
Structure des dossiers
|-pom.xml
`-target/
pom.xml
<?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>example</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</project>
Résultat d'exécution
> mvn clean
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello ---
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Structure des dossiers (après exécution)
`-pom.xml
nettoyer
est associé à la phase propre
par défaut (déroutant)
--Par défaut, les dossiers suivants sont ciblés pour la suppression
${project.build.directory}
${project.build.outputDirectory}
${project.build.testOutputDirectory}
${project.reporting.outputDirectory}
-- $ {project.basedir} / target
sera supprimé sauf si vous avez changé le chemin du dossier ci-dessus.Structure des dossiers
|-pom.xml
|-target/
`-foo/
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<filesets>
<fileset>
<directory>${project.basedir}/foo</directory>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
</project>
<filesets>
et ajout du dossier foo
à supprimerRésultat d'exécution
> mvn clean
...
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ hello ---
[INFO] Deleting ...\foo (includes = [], excludes = [])
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Structure des dossiers (après exécution)
`-pom.xml
target
mais foo
a été supprimé<filesets>
spécifie la collection de Fileset Faire
--Il semble que vous puissiez affiner les fichiers non seulement avec <directory> '' mais aussi avec
Il est trop difficile de comprendre où et quelles informations se trouvent, alors je vais les trier </ del>