是否有生成 POM.xml 文件的 Java 类?

2022-09-02 11:25:47

在我的工作项目中,我最近被要求通过java类生成POM文件。问题是我对Maven非常非常陌生(就像去年12月以来一样)。

我需要的是一个以某种方式生成xml文件(pom文件,但如果我可以配置任何xml创建代码,那么代码就可以了)的代码,给定所有必要的数据,这样他们就不需要手动编写它。我不知道我是否在解释自己,但问题是,是否有任何库或类使用给定数据生成或构造POM文件?如果不是这样就好了,我只是不想浪费更多的时间来搜索我不知道它是否存在的东西,或者是否像声明一个POM对象然后做一个简单的文档d = generatePom(POM p)。一样简单。由于没有人抱怨编写POM文件有多难,我认为应该有一个简单的方法来做它们,但我认为我已经在很多API javadoc中迷失了自己,我找不到回去的路。

如果没有代码,我的想法是搜索POM字典(以涵盖所有元素),并使用给定的POM对象(我之前用提供的数据填充了该对象)创建一个xml文件,例如JDOM,XOM或XStream。如果没有已经这样做的课程(例如“嘿!你做错了”),那么任何关于此的想法都将不胜感激。

PS:我已经读到Eclipse项目正在做一些Maven的事情,它有一个API,可以为你拥有的实际项目生成一个pom.xml文件。如果我能覆盖输入数据或其他内容,那将是一件好事。

谢谢大家!


答案 1

这取决于你想做什么。如果您只想为肯定类型的新项目创建POM,最好的方法是通过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使用)。


答案 2
        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

尽管如果我必须添加多个(未知数量的)依赖项,我仍然陷入困境。


推荐