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

时间:2010-01-25 09:47:26

标签: java maven pom.xml

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

我需要的是一个生成xml文件的某种代码(一个pom文件,但是如果我可以配置任何xml创建代码,那将很好)给出所有必要的数据,所以他们不需要通过手。我不知道我是否在解释自己,但问题是,是否有任何库或类生成或构造具有给定数据的POM文件? 如果不是那么好,我只是不想花更多的时间来寻找我不知道的东西,如果它甚至存在,或者是否像宣告POM对象一样简单然后做一个简单的文档d = generatePom(POM p)。既然没有人抱怨写POM文件有多难,我应该有一个简单的方法来做它们但我想我已经迷失了很多API javadoc并且我找不到回来的路。

我的想法是,如果没有代码,那就是搜索POM字典(覆盖所有元素)并创建一个带有给定POM对象的xml文件(我以前填充了我提供的数据),使用一个XML生成器,如JDOM,XOM或XStream。如果没有任何课程已经这样做(例如'嘿!你做错了'),任何对此的想法都会受到赞赏。

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

谢谢大家!

4 个答案:

答案 0 :(得分:38)

这取决于你想要做什么。如果你只是想为一个肯定类型的新项目创建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使用)。

答案 1 :(得分:3)

        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 :(得分:1)

为什么必须在java中使用它而不是使用m2eclipse等现有工具 有关使用m2eclipse为现有项目创建POM,请参阅guide

您还可以看到m2eclipse developer guide,它可以让您查看其实施的源代码。

回复----
这是尝试对项目进行整形时遇到的常见问题 最大的障碍是试图找出正确的maven coordinates 项目通常是指重命名的jar文件,其中group-id和版本号已被删除。

有时检查jar文件中的清单会给出一些关于正确依赖工件的提示。

答案 3 :(得分:1)

要生成具有多个依赖项的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