Как я могу встроить 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.
Надеюсь, что это указывает вам в правильном направлении.