سؤال

نظرا لمشروع Maven مع POM POM - بما في ذلك معظم إصدارات المساعدات الإضافية والمساعدات - كيف يمكنني إنشاء POM الذي يأخذ المعلومات من الأصل، يضعه في الطفل ويزيل الإشارة إلى الوالد؟

من الناحية المثالية، سيتم ذلك مع البرنامج المساعد من Maven-Teally.


تحديث: أحتاج إلى ذلك تلقائيا، لأنها يدويا أنها مملة ومملة.

تحديث 2.: أقوم بإعداد شفرة المصدر لخارجي وتريد تقديم مشروع واحد فقط، وليس العائلة بأكملها.

هل كانت مفيدة؟

المحلول

كان لدي مشكلة مماثلة لفترة طويلة، يمكنك تجنب استبدال الأفكار على الخصائص وحل المسارات وما إلى ذلك عن طريق تحديد مساعد جديد من Maven للقيام بما يلي.

  • حل كل والد باستخدام مصنع القطع الأثرية القياسية
  • قراءة كل ملف بوم (دون حلها) باستخدام MaVenXPPP3Reader
  • دمج المشاريع التي لم يتم حلها
  • اكتب المشروع المدمج إلى ملف

فيما يلي بعض رمز الاختبار الذي اعتدت إثبات العملية لنفسي، من الواضح أنك تحتاج إلى التفاف هذا في مقدما في مافن وربط أنه لبعض مراحل العملية الخاصة بك. يتم إخراج POM المقرر إخراج إلى دليل الإخراج (الهدف IE) مع حل الاسم - Pom.xml افتراضيا، يمكن تجاوز هذين الخصائصين مع نهج تكوين المكونات الإضافية المعتادة من خلال تحديد خصائص "OutputDir" و / أو "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);
    }
}

نصائح أخرى

سيكون mvn help:effective-pom افعل ما تحتاجه؟ يمكنك إرسال الإخراج إلى ملف مع -Doutput=new-pom.xml.

إذا كنت لا تريد أحد الوالدين، يمكنك تجربة نمط BOM (فاتورة المواد) وحدد أن بوم للاستيراد في قسم إدارة التصدير الخاص بك.

نظرا لأنك لا تريد أي إشارات إلى أي شيء آخر، فستحتاج إلى إنشاء تطبيق لتحليل XML من "الوالدين" ثم اكتبها إلى ملف POM الهدف في قسم التبعيات. لا أعتقد أن هناك أي مكون إضافي للقيام بما تريده لأنه يبدو أنه يتعارض مع نواة كيف من المفترض أن يساعدك مافن. النقطة كلها من Maven هي بحيث يمكنك تضمين جميع التخصصات الخاصة بك باستخدام الميراث أو استيرادها مع نطاق الاستيراد.

خيار آخر، لكنني أعتقد أنك تم استبعادها، والحفاظ على ملف POM قابل للسجن بشكل منفصل. على الرغم من أنني أعتقد أنك قد تجد وقتا أسهل مع هذا إذا قمت بالرجوع إلى أحدث أو لقطات ثم استخدم البرنامج المساعد الإصدار لحلها في الإصدارات التي تم إصدارها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top