在我的工作项目中,我最近被要求通过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文件。如果我可以覆盖输入数据或其他东西,那将是一件好事。谢谢大家!
答案 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