有没有一个Java类可以生成POM.xml文件?

20
在我的工作项目中,我最近被要求通过一个Java类生成POM文件。问题在于,我非常非常新手Maven(自上个十二月以来才开始接触)。
我需要的是一些代码,可以给定所有必要的数据生成一个XML文件(POM文件,但如果我可以配置任何创建XML的代码,也可以),这样他们就不需要手动编写了。我不知道我是否表达清楚了,但问题是,有没有库或类可以根据给定数据生成或构造POM文件?
如果没有,那也没关系,我只是不想再浪费更多的时间搜索我甚至不知道它是否存在或是否像声明POM对象,然后执行一个简单的Document d = generatePom(POM p) 那样简单. 由于没有人抱怨编写POM文件有多难,我认为应该有一种简单的方法来完成它们,但我认为我已经在很多API javadoc中迷失了自己,找不到回来的路。
如果没有现成的代码,我的想法是搜索POM字典(以涵盖所有元素),并使用诸如JDOM、XOM或XStream等XML生成器创建具有给定POM对象的XML文件(我之前填充了提供的数据)。如果没有已经实现这一功能的类(比如“嘿!你做错了”),对此的任何想法都将不胜感激。
PS:我已经读到Eclipse项目正在做一些Maven的事情,并且有一个API可以为你实际拥有的项目生成pom.xml文件。如果我可以覆盖输入数据或其他什么东西,那将是很棒的事情。
谢谢大家!
4个回答

51

这取决于你想要做什么。如果你只是想为某种类型的新项目创建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,您需要添加所有必要的异常处理。

Javadoc在此处:http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

要访问此API,您应该添加此依赖项:

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

也有相应的读取API,但要记住它不会执行所有Maven操作,如继承和插值(要做到这一点需要更高级的API使用)。


1
哇!我的意思是...那真的是我在寻找的。我可以随意设置所有的setters和编写pom.xml文件。我试用了一下这个库,看起来非常棒。真的,谢谢! :) - Random
4
如果你想知道Brett是怎么知道这个的,那是因为他写了《Apache Maven2: Effective Implementation》这本书:http://brettporter.wordpress.com/。 - Tim O'Brien
这太棒了。非常感谢您的建议。 这个库非常有用...!!! - isuru chathuranga

4
        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 但如果我需要添加多个(数量未知)依赖项,我仍然卡住了。

2
为了生成带有多个依赖项的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();

敬礼,
Srikanth Praveen


1

为什么你要用Java来做,而不是使用现有的工具,比如m2eclipse。
请参阅指南,了解如何使用m2eclipse为现有项目创建POM。

您还可以查看m2eclipse开发人员指南,以查看其实现的源代码。

回复----
这是在尝试将项目转换为Maven时经常遇到的问题。
最大的障碍是尝试识别正确的Maven坐标
通常,项目引用已重命名的JAR文件,其中组ID和版本号已被剥离。

有时,在JAR文件中检查清单会提供一些关于正确依赖项的提示。


这个想法不仅仅是为了生成我正在工作的项目的pom.xml文件,而是为了生成任何项目的pom.xml文件。我知道他们会存储所需的数据,然后将其提供给我来创建pom文件。 我不知道他们是如何存储这些数据的(或者为什么他们不直接生成pom文件而是存储它),我只知道我会收到这些数据(太棒了,模块化业务)。 感谢指南,我会看看他们的代码能做些什么 :) - Random
谢谢你的建议 :) 虽然我已经拿到了这些数据,所以希望它们是正确和真实的。不管怎样,如果我在Maven坐标方面遇到问题,那么我将检查数据的给定方式,我认为那可能是某种类型的连接问题(但我希望不会发生!)。Brett Porter给出的答案正是我需要的。我真的希望没有更多的问题 :) - Random

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接