19

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

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

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

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

谢谢大家!

4

4 回答 4

47

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

于 2010-01-25T12:52:52.870 回答
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

虽然如果我必须添加多个(未知数量的)依赖项,我仍然会被卡住。

于 2014-08-06T23:54:28.130 回答
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

于 2018-05-12T08:04:53.930 回答
1

为什么你必须在 java 中而不是使用现有的工具,如 m2eclipse。
请参阅使用 m2eclipse 为现有项目创建 POM 的 指南。

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

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

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

于 2010-01-25T10:20:08.817 回答