Как я могу встроить Maven 2 в свое приложение?

Я хотел бы встроить Maven или библиотеку, которая делает всю магию в мое Java-приложение.

Ключевые точки:

  • Это две задачи, которые я хочу выполнить:

    1 / Публикация банки в локальном хранилище
    2/ Публикация баночки в хранилище частного предприятия (Nexus)

  • Все необходимые банки ДОЛЖНЫ быть расположены в общедоступном хранилище Maven.

  • Банки ДОЛЖНЫ быть независимыми от Maven (то есть не относятся к Maven 2 или 3)

Если вы можете, пожалуйста, предоставьте фрагмент с вашим ответом.

3 ответа

Решение

Вот пример встраивания библиотек Maven 2:

Вместо того, чтобы искать строителя проекта, вы можете посмотреть ArtifactInstaller а также ArtifactDeployer - вы найдете код, который вы хотите в maven-install-plugin и maven-deploy-plugin,

Различие только в POSTing в этом примере состоит в том, что он будет генерировать соответствующие метаданные, контрольные суммы и преобразования снимков.

Библиотеки Maven 3 может быть проще встраивать и сохранять совместимость с Maven 2, однако у меня нет доступных примеров.

Клиенты Maven отправляют контент в Nexus, используя обычную HTTP-операцию "POST". Если все, что вы хотите сделать, это опубликовать контент, то вам не нужна вся логика для загрузки и разрешения зависимостей....

Если вы решите, что вам нужна полноценная совместимость с репозиторием Maven, я бы посоветовал имитировать то, что сделали другие проекты, такие как Groovy, Gradle и Scala, то есть встроить Apache Ivy.

Я нашел следующую статью, описывающую, как добавить плющ в ваш проект Java (зависимость Single 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.

Надеюсь, что это указывает вам в правильном направлении.

Другие вопросы по тегам