如何将Maven嵌入到我的应用程序中?

时间:2011-11-23 14:35:17

标签: java maven-2 maven maven-deploy-plugin maven-install-plugin

我想将Maven或具有所有魔力的库嵌入到我的Java应用程序中。

关键点:

  • 这是我想要执行的两项任务:

    1 /在本地存储库中发布jar 2 /在私有企业存储库(Nexus)中发布jar

  • 所有必需的罐子必须位于公共Maven存储库中

  • 罐子应该是Maven版本不可知的(即不是特定于Maven 2或3)

如果可以,请提供您的回复摘录。

3 个答案:

答案 0 :(得分:4)

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使您可以使用Ivy's documented ANT tasks

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]")
}

答案 1 :(得分:2)

以下是嵌入Maven 2库的示例:

您可以查找ArtifactInstallerArtifactDeployer - 而不是查找项目构建器 - 您可以在maven-install-pluginmaven-deploy-plugin中找到所需的代码

此示例中仅POST的区别在于它将生成适当的元数据,校验和和快照转换。

Maven 3库可能更容易嵌入并与Maven 2保持兼容,但是我没有任何可用的示例。

答案 2 :(得分:1)

我没有尝试过你想要的东西,但我会先看看Maven Embedder项目。甚至m2e项目也可能附带嵌入式Maven版本(以及使用外部安装的能力)。

本地发布可能涉及调用maven-install-plugin,远程发布可能涉及使用maven-deploy-plugin。

希望这能指出你正确的方向。