سؤال

في مشروع وظيفتي ، طُلب مني مؤخرًا إنشاء ملفات POM عبر فصل Java. المشكلة هي أنني جديد جدًا على Maven (مثل منذ شهر ديسمبر الماضي).

ما أحتاجه هو رمز بطريقة أو بأخرى ينشئ ملف XML (ملف POM ، ولكن إذا كان بإمكاني تكوين أي رمز إنشاء XML سيكون جيدًا) بالنظر إلى جميع البيانات الضرورية ، لذلك لا يحتاجون إلى كتابته باليد. لا أعرف ما إذا كنت أشرح نفسي ، لكن السؤال هو ، هل هناك أي مكتبة أو فئة تقوم بإنشاء ملف POM أو يبنيه ببيانات معينة؟ إذا لم يكن هذا على ما يرام ، فأنا لا أريد أن أفقد المزيد من الوقت في البحث عن شيء لا أعرف ما إذا كان موجودًا أو إذا كان بسيطًا مثل إعلان كائن POM ثم القيام بوثيقة تافهة D = GeneratePom (POM P). نظرًا لأن لا أحد يشكو من مدى صعوبة كتابة ملفات POM ، فإنني يجب أن تكون هناك طريقة سهلة للقيام بها ، لكنني أعتقد أنني فقدت نفسي في الكثير من API Javadoc ولا يمكنني العثور على طريقي إلى العودة.

فكرتي إذا لم يكن هناك رمز لهذا هو البحث عن قاموس POM (لتغطية جميع العناصر) وإنشاء ملف XML مع كائن POM معين (كان قد ملأته سابقًا بالبيانات التي قدمتها) ، باستخدام مولد XML مثل JDOM أو XOM أو XSTEREM. أي أفكار حول هذا سيكون موضع تقدير إذا لم يكن هناك فصل يقوم بذلك بالفعل (مثل "مهلا! أنت تفعل ذلك بشكل خاطئ").

ملاحظة: لقد قرأت أن مشروع Eclipse يقوم ببعض الأشياء Maven وأنه يحتوي على واجهة برمجة تطبيقات يولد ملف pom.xml للمشروع الفعلي الذي لديك. سيكون ذلك شيئًا رائعًا إذا تمكنت من تجاوز بيانات الإدخال أو شيء من هذا القبيل.

شكرا للجميع!

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

المحلول

ذلك يعتمد على ما تحاول القيام به. إذا كنت ترغب فقط في إنشاء POMS لمشاريع جديدة من نوع بالتأكيد ، فإن أفضل طريقة هي من خلال النماذج الأصلية Maven (يمكنك إنشاء نماذجك الخاصة مع القوالب التي تريدها).

إذا كنت بحاجة حقًا إلى كتابة POM برمجيًا ، فيمكنك استخدام ما يلي:

import org.apache.maven.model.*;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
...
Model model = new Model();
model.setGroupId( "some.group.id" );
...
new MavenXpp3Writer().write( w, model );

... حيث W هو java.io.writer وتضيف جميع معالجة الاستثناءات اللازمة.

جافادوك هنا: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

للوصول إلى واجهة برمجة التطبيقات هذه ، يجب عليك إضافة هذه التبعية:

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>2.2.1</version>
</dependency>

هناك واجهة برمجة تطبيقات للقراءة المقابلة أيضًا ، ولكن ضع في اعتبارك أنها لن تفعل جميع عمليات Maven مثل الميراث والاستيفاء (للقيام بذلك يتطلب استخدام API أكثر تقدمًا).

نصائح أخرى

        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model pomModel = reader.read(new FileReader(pomLibFile));
        final List<Dependency> dependencies= pomModel.getDependencies();
        final List<String> modules= pomModel.getModules();
        final List<Profile> profiles = pomModel.getProfiles();

        InputStream inputStream = new FileInputStream(new File(pomLibFile));
        StringWriter writer = new StringWriter();
        IOUtils.copy(inputStream, writer, "utf-8");
        pomModel.getDependencyManagement();
        final Properties properties = new Properties();
        properties.load(new FileInputStream(pomProperties));
        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();

        interpolator.addValueSource( new EnvarBasedValueSource() );
        interpolator.addValueSource( new PropertiesBasedValueSource( properties ) );

        List<String> synonymPrefixes = new ArrayList<String>();
        synonymPrefixes.add( "project." );
        synonymPrefixes.add( "pom." );

        PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper( new ObjectBasedValueSource( pomModel ),synonymPrefixes, true );
        interpolator.addValueSource( modelWrapper );

        PrefixedValueSourceWrapper pomPropertyWrapper = 
                new PrefixedValueSourceWrapper( new PropertiesBasedValueSource( pomModel.getProperties() ), synonymPrefixes,  true );
        interpolator.addValueSource( pomPropertyWrapper );

        interpolator.addValueSource( new PropertiesBasedValueSource( properties ) );

        RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( synonymPrefixes, true );

        String serializedPOM = interpolator.interpolate( writer.toString(), recursionInterceptor );
        System.out.println("-------- "+serializedPOM);;

المرجعي : http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html

على الرغم من أنني ما زلت عالقًا إذا اضطررت إلى إضافة تبعيات متعددة (غير معروفة).

لإنشاء POM مع تبعيات متعددة ، يمكنك استخدام رمز العينة التالي:

Model model = new Model();  
Writer writer = new FileWriter("C:/GRADLE_WORKSPACE/test.pom");  
List<Dependency> dependencyList = new ArrayList<Dependency>();  

model.setGroupId( "TestGroupArtifactID" );    
model.setArtifactId("TestGroupArtifactName");    
model.setVersion("1.0.0");    

Dependency dep = new Dependency();    
dep.setGroupId("TestGroupId");    
dep.setArtifactId("TestDependencyName");    
dep.setVersion("1.0.0");
dependencyList.add(dep);

Dependency dep2 = new Dependency();    
dep2.setGroupId("TestGroupId2");    
dep2.setArtifactId("TestDependencyName2");   
dep2.setVersion("2.0.0");     
dependencyList.add(dep2);       

//model.addDependency(dep);    
model.setDependencies(dependencyList);    
new MavenXpp3Writer().write(writer, model );    
writer.close();

يعتبر،
سريكانث برافين

لماذا يجب عليك القيام بذلك في Java بدلاً من استخدام أداة موجودة مثل M2Eclipse.
يرى يرشد لإنشاء POM لمشروع موجود باستخدام M2Eclipse.

يمكنك أيضا رؤية دليل مطور M2Eclipse مما سيتيح لك رؤية الكود المصدري لتنفيذها.

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

في بعض الأحيان ، يعطي تفتيش البيان في ملف الجرة بعض التلميحات فيما يتعلق بالقطع الأثرية المعتمدة الصحيحة.

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