5

我想在我的 Java 应用程序中嵌入 Maven 或执行所有魔法的库。

关键点:

  • 它们是我要执行的两项任务:

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

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

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

如果可以,请在您的回复中提供一个片段。

4

3 回答 3

4

Maven 客户端使用普通的 HTTP“POST”操作将内容推送到 Nexus。如果您只想发布内容,那么您不需要下载和解析依赖项的所有逻辑......

如果您决定需要全面的 Maven 存储库互操作性,那么我建议您效仿 Groovy、Gradle 和 Scala 等其他项目所做的事情,即嵌入Apache 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 记录的 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]")
}
于 2011-11-24T21:56:30.003 回答
2

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

无需查找项目构建器,您可以查找ArtifactInstallerArtifactDeployer- 您会在 和 中找到您想要的maven-install-plugin代码maven-deploy-plugin

本例中仅 POST 的不同之处在于它将生成适当的元数据、校验和和快照转换。

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

于 2011-11-29T06:38:03.140 回答
1

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

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

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

于 2011-11-23T15:57:58.647 回答