【问题标题】:How can I embed Maven into my application?如何将 Maven 嵌入到我的应用程序中?
【发布时间】:2012-01-04 20:20:51
【问题描述】:

我想在我的 Java 应用程序中嵌入 Maven 或能够发挥所有魔力的库。

关键点:

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

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

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

  • jar 应该与 Maven 版本无关(即不特定于 Maven 2 或 3)

如果可以,请在回复中提供一个 sn-p。

【问题讨论】:

  • 已经回答here

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个嵌入 Maven 2 库的示例:

    您可以查找ArtifactInstallerArtifactDeployer,而不是查找项目构建器 - 您会在maven-install-pluginmaven-deploy-plugin 中找到您想要的代码。

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

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

    【讨论】:

    【解决方案3】:

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

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

    希望这会为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2014-10-21
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2013-07-31
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多