Question

Étant donné un projet Maven avec un POM parent - incluant l'extension pour la plupart et les versions de dépendance - comment puis-je générer un POM qui prend les informations du parent, il place dans l'enfant et supprime la référence au parent

Idéalement, ce serait fait avec le plugin maven-assemblage.


Mise à jour :. J'ai besoin ce fait automatiquement, puisque manuellement est ennuyeux et fastidieux

Mise à jour 2 :. Je prépare le code source pour un externe et que vous voulez livrer un seul projet, et non pas l'ensemble de la famille

Était-ce utile?

La solution

J'ai eu un problème similaire un certain temps, vous pouvez éviter Maven substituer aux propriétés et à la résolution des chemins, etc. en définissant un nouveau plugin Maven pour faire ce qui suit.

  • Resolve chaque parent à l'aide de l'usine d'artefact standard
  • Lisez chaque fichier pom (sans le résoudre) en utilisant le MavenXpp3Reader
  • Fusionner les projets non résolus
  • Ecrire le projet fusionné dans un fichier

Voici un code de test utilisé pour prouver que je le processus pour moi-même, vous auriez évidemment besoin d'envelopper cela dans un plugin Maven et lier que dans une certaine phase de votre processus. La pom résolue est sortie dans le répertoire de sortie (c.-à-cible) avec le nom résolu-pom.xml par défaut, ces deux propriétés peuvent être remplacées avec l'approche habituelle de configuration plugin Maven en définissant les propriétés « outputDir » et / ou « pomfileName » .

package name.seller.rich;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Stack;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.inheritance.ModelInheritanceAssembler;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

/**
 * @goal output-project
 * @phase process-resources
 * @requiresProject true
 */
public class OutputResolvedProjectMojo extends AbstractMojo {

    /**
     * Used to look up overlay the parent models on the project's model.
     * 
     * @parameter expression=
     *            "${component.org.apache.maven.project.inheritance.ModelInheritanceAssembler}"
     * @required
     * @readonly
     */
    private ModelInheritanceAssembler modelInheritanceAssembler;

    /**
     * Used to look up Artifacts in the remote repository.
     * 
     * @parameter expression=
     *            "${component.org.apache.maven.artifact.factory.ArtifactFactory}"
     * @required
     * @readonly
     */
    protected org.apache.maven.artifact.factory.ArtifactFactory factory;

    /**
     * Used to look up Artifacts in the remote repository.
     * 
     * @parameter expression=
     *            "${component.org.apache.maven.artifact.resolver.ArtifactResolver}"
     * @required
     * @readonly
     */
    protected org.apache.maven.artifact.resolver.ArtifactResolver artifactResolver;

    /**
     * List of Remote Repositories used by the resolver
     * 
     * @parameter expression="${project.remoteArtifactRepositories}"
     * @readonly
     * @required
     */
    protected java.util.List remoteRepos;

    /**
     * Location of the local repository.
     * 
     * @parameter expression="${localRepository}"
     * @readonly
     * @required
     */
    protected org.apache.maven.artifact.repository.ArtifactRepository local;

    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject mavenProject;

    /**
     * The directory to output the resolved project to.
     * 
     * @parameter expression="${project.build.directory}"
     */
    private File outputDir;

    /**
     * The directory to output the resolved project to.
     * 
     * @parameter expression="resolved-pom.xml"
     */
    private String pomfileName;

    public void execute() throws MojoExecutionException, MojoFailureException {
        MavenProject parentProject = mavenProject.getParent();

        // get the unresolved project by reading the file
        MavenProject bareProject = readBareProject(mavenProject.getFile());

        Stack hierarchy = new Stack();
        hierarchy.push(bareProject);

        try {
            while (parentProject != null) {

                try {
                    // get Maven to resolve the parent artifact (download if
                    // needed)
                    Artifact pomArtifact = this.factory.createArtifact(
                            parentProject.getGroupId(), parentProject
                                    .getArtifactId(), parentProject
                                    .getVersion(), "", "pom");

                    artifactResolver.resolve(pomArtifact, this.remoteRepos,
                            this.local);

                    // get the file from the local repository and read the bare
                    // project
                    File parentPomFile = pomArtifact.getFile();

                    parentProject = readBareProject(parentPomFile);

                    hierarchy.push(parentProject);

                    parentProject = parentProject.getParent();
                } catch (ArtifactResolutionException e) {
                    getLog().error("can't resolve parent pom", e);
                } catch (ArtifactNotFoundException e) {
                    getLog().error("can't resolve parent pom", e);
                }
            }

            // merge each model starting with the oldest ancestors
            MavenProject currentParent = (MavenProject) hierarchy.pop();
            MavenProject currentProject = null;
            while (hierarchy.size() != 0) {
                currentProject = (MavenProject) hierarchy.pop();
                modelInheritanceAssembler.assembleModelInheritance(
                        currentProject.getModel(), currentParent.getModel());
                currentParent = currentProject;
            }

            // spit the merged model to the output file.
            Writer writer = getWriter(outputDir, pomfileName);

            if (writer != null) {
                currentProject.writeModel(writer);
                writer.close();
            }
        } catch (IOException e) {
            getLog().error("can't write resolved pom", e);
        }

    }

    /**
     * Creates and returns a writer for outputting the project to a pom file.
     * 
     * @param logDir
     *            the directory to output the file to.
     * @param logFileName
     *            name of the log file
     * @return the writer.
     * @throws IOException
     *             if the writer cannot be created.
     */
    private Writer getWriter(final File logDir, final String logFileName)
            throws IOException {
        if (!logDir.exists()) {
            logDir.mkdirs();
        }

        File pomLog = new File(logDir, logFileName);

        if (!pomLog.exists()) {
            pomLog.createNewFile();
        }

        return new FileWriter(pomLog);
    }

    /**
     * Read the mavenProject without resolving any inherited settings.
     * 
     * @return the MavenProject for the project's POM
     * @throws MojoExecutionException
     *             if the POM can't be parsed.
     */
    MavenProject readBareProject(final File file) {
        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model model = null;
        try {
            model = reader.read(new FileReader(file));
        } catch (IOException e) {
            getLog().error("can't read pom file", e);
        } catch (XmlPullParserException e) {
            getLog().error("can't read pom file", e);
        }

        return new MavenProject(model);
    }
}

Autres conseils

Souhaitez mvn help:effective-pom faire ce que vous avez besoin? Vous pouvez envoyer la sortie vers un fichier avec -Doutput=new-pom.xml.

Si vous ne voulez pas un parent, vous pouvez essayer le modèle de nomenclature (projet de loi de matériaux) et sélectionnez-pom pour l'importation dans votre section de gestion de dépendance.

Puisque vous voulez aucune référence à quoi que ce soit d'autre, vous aurez besoin de construire une application pour analyser le xml des « parents » et les écrire dans le fichier pom cible dans la section des dépendances. Je ne pense pas qu'il y ait un plugin pour faire ce que vous voulez, car il semble aller contre le noyau même de la façon dont Maven est censé vous aider. Le point entier de Maven est que vous pouvez inclure toutes vos dépendances en utilisant l'héritage ou de les importer avec le champ d'importation.

Une autre option, mais je pense que vous avez exclu, est de maintenir votre fichier libérable POM séparément. Bien que je pense que vous trouverez peut-être un temps plus facile avec cela si vous faites référence à DERNIERS ou SNAPSHOTS puis utilisez le plugin version pour les résoudre aux versions publiées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top