是否有生成 POM.xml 文件的 Java 类?
Posted
技术标签:
【中文标题】是否有生成 POM.xml 文件的 Java 类?【英文标题】:Is there a Java Class that generates a POM.xml file? 【发布时间】:2011-01-09 00:52:49 【问题描述】:在我的工作项目中,我最近被要求通过 java 类生成 POM 文件。问题是我对 Maven 非常非常陌生(从去年 12 月开始)。
我需要的是在给定所有必要数据的情况下生成一个 xml 文件(一个 pom 文件,但如果我可以配置任何 xml 创建代码)的某种代码,所以他们不需要编写它手。我不知道我是否在解释自己,但问题是,是否有任何库或类可以生成或构造具有给定数据的 POM 文件? 如果不是这样就好了,我只是不想浪费更多时间搜索我不知道它是否存在或者是否像声明 POM 对象然后做一个琐碎的 Document d = generatePom(POM p)。由于没有人抱怨编写 POM 文件有多难,我想应该有一种简单的方法来完成它们,但我认为我在很多 API javadoc 中迷失了自己,我找不到回去的路了。
如果没有代码,我的想法是搜索 POM 字典(以涵盖所有元素)并使用给定的 POM 对象(我之前填充了我提供的数据)创建一个 xml 文件,使用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 使用)。
【讨论】:
哇!我的意思是……这实际上就是我想要的。我真的可以做所有的设置器并在我想要的任何地方编写 pom.xml 文件。我已经尝试了一点这个图书馆,似乎创造了奇迹。真的谢谢! :) 如果您想知道 Brett 是如何知道这一点的,那是因为他写了 Apache Maven2:有效实施:brettporter.wordpress.com 这太棒了。非常感谢您的建议。这个库很有用……!!!【参考方案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
尽管如果我必须添加多个(未知数量的)依赖项,我仍然会卡住。
【讨论】:
【参考方案3】:要生成具有多个依赖项的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();
问候, 斯里坎特·普拉文
【讨论】:
【参考方案4】:为什么你必须在 java 中而不是使用现有的工具,例如 m2eclipse。 有关使用 m2eclipse 为现有项目创建 POM 的信息,请参阅 guide。
您还可以查看m2eclipse developer guide,它可以让您查看其实现的源代码。
回复---- 这是尝试 mavenise 项目时遇到的常见问题。 最大的障碍是尝试识别正确的maven coordinates。 通常项目引用重命名的 jar 文件,其中组 ID 和版本号已被剥离。
有时检查 jar 文件中的清单会给出一些关于正确依赖工件的提示。
【讨论】:
这个想法不仅仅是生成我正在工作的项目的 pom.xml,而是生成任何项目的 pom.xml 文件。我知道他们存储了所需的数据,然后将其交给我来创建 pom。我不知道他们如何存储这些数据(或者为什么他们只是不生成 pom 而不是存储它)我只知道我要接收它(万岁模块化业务)。感谢您的指导,我会看看我能用他们的代码做什么:) 感谢您的建议 :) 虽然我得到了这些数据,所以我希望它们是正确和真实的。无论如何,如果我的 Maven 坐标有问题,那么我将检查数据是如何给出的,我认为这将是某种类型的连接问题(但我希望这不会发生!)。 Brett Porter 给出的答案正是我真正需要的。我真的希望没有更多的问题:)以上是关于是否有生成 POM.xml 文件的 Java 类?的主要内容,如果未能解决你的问题,请参考以下文章
java编译通过(基于pom.xml),为什么还是提示很多类找不到?看截图
将生成的 jar 文件的名称从 Maven pom.xml 传递到 Dockerfile