如何将Maven 2嵌入到我的应用程序中?
我想将Maven或具有所有魔力的库嵌入到我的Java应用程序中。
关键点:
-
它们是我想要执行的两个任务:
1 /在本地存储库中发布jar
2 /在私有企业存储库中发布jar(Nexus) -
所有必需的jar子必须位于公共Maven存储库中
-
jar子应该是Maven版本不可知的(即不是特定于Maven 2或3)
如果可以,请提供您的回复片段。
以下是嵌入Maven 2库的示例:
- CentralRepositoryService.java
- 的pom.xml
您可以查找ArtifactInstaller
和ArtifactDeployer
,而不是查找项目构建器 – 您可以在maven-install-plugin
和maven-deploy-plugin
找到所需的代码。
在这个例子中只是POSTing的区别在于它将生成适当的元数据,校验和和快照转换。
Maven 3库可能更容易嵌入并与Maven 2保持兼容,但是我没有任何可用的示例。
Maven客户端使用正常的HTTP“POST”操作将内容推送到Nexus。 如果您只想发布内容,那么您不需要所有下载和解析依赖项的逻辑….
如果您确定需要完整的Maven存储库互操作性,那么我建议模拟Groovy,Gradle和Scala等其他项目,即嵌入Apache Ivy 。
我发现以下文章描述了如何将ivy添加到java项目中(单jar依赖):
http://developers-blog.org/blog/default/2010/11/08/Embed-Ivy-How-to-use-Ivy-with-Java
Groovy示例
您的问题具体是如何添加对发布内容的支持。
以下代码使用ivy发布到Nexus仓库。 Groovy使您可以使用常春藤记录的ANT任务 。
import groovy.xml.NamespaceBuilder import groovy.xml.MarkupBuilder // Methods // ======= def generateIvyFile(String fileName) { def file = new File(fileName) file.withWriter { writer -> xml = new MarkupBuilder(writer) xml."ivy-module"(version:"2.0") { info(organisation:"org.dummy", module:"dummy") publications() { artifact(name:"dummy", type:"pom") artifact(name:"dummy", type:"jar") } } } return file } def generateSettingsFile(String fileName) { def file = new File(fileName) file.withWriter { writer -> xml = new MarkupBuilder(writer) xml.ivysettings() { settings(defaultResolver:"central") credentials(host:"myrepo.com" ,realm:"Sonatype Nexus Repository Manager", username:"deployment", passwd:"deployment123") resolvers() { ibiblio(name:"central", m2compatible:true) ibiblio(name:"myrepo", root:"http://myrepo.com/nexus", m2compatible:true) } } } return file } // Main program // ============ def ant = new AntBuilder() def ivy = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant') generateSettingsFile("ivysettings.xml").deleteOnExit() generateIvyFile("ivy.xml").deleteOnExit() ivy.resolve() ivy.publish(resolver:"myrepo", pubrevision:"1.0", publishivy:false) { artifacts(pattern:"build/poms/[artifact].[ext]") artifacts(pattern:"build/jars/[artifact].[ext]") }
我没有尝试过你想要的东西,但我会先看看Maven Embedder项目。 可能甚至m2e项目也附带嵌入式Maven版本(以及使用外部安装的能力)。
本地发布可能涉及调用maven-install-plugin,远程发布可能涉及使用maven-deploy-plugin。
希望这能指出你正确的方向。