Анонимизировать pom.xml при выпуске

У меня есть артефакты, которые созданы и выпущены с использованием Maven. Исходный pom.xml артефакта содержит обычную информацию о проекте (artifactId, имя и т. д.) и зависимости. Это нормально. Но pom.xml также включает личную информацию, такую ​​как URL-адреса SCM, имена разработчиков или родительский артефакт.

Есть ли способ сказать Maven сгенерировать очищенный pom.xml, чтобы артефакт можно было опубликовать, не уничтожая соответствующую техническую информацию, такую ​​​​как зависимости?

Ни URL-адреса SCM, ни список разработчиков, ни существование parent-pom (который используется только для определений DepMgmt и других метаматериалов) не имеют значения для пользователей артефакта, поэтому я предполагаю, что меня можно удалить из выпущен файл pom.xml

Эта информация содержится в файле pom.xml как в менеджере репозитория, таком как Archiva, так и в файле jar артефакта. Я предполагаю, что Maven просто копирует все это.

Обобщить:

У меня есть:

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.example</groupId>
   <artifactId>my-artifact</artifactId>
    <scm>
        <connection>scm:svn:http://buildmachine/org.example/my-artifact/trunk</connection>
        <developerConnection>scm:svn:http://buildmachine/org.example/my-artifact/trunk</developerConnection>
        <url>http://buildmachine/org.example/my-artifact/trunk</url>
    </scm>
    <dependencies>
        <dependency>
            ...
        </dependency>
    </dependencies>

Я хочу:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>my-artifact</artifactId>
    <dependencies>
        <dependency>
            ...
        </dependency>
    </dependencies>

person mhaller    schedule 20.11.2009    source источник
comment
Под релизом вы имеете в виду использование плагина Maven Release?   -  person Pascal Thivent    schedule 20.11.2009
comment
Да, maven-релиз-плагин. Удаление: ну, они содержат внутреннюю информацию разработки, такую ​​как имя хоста сервера сборки. Клиентам не нужно знать имя хоста моего билдсервера. В проектах OSS это может быть неактуально, но в корпоративных средах это вопрос безопасности. (Да, знаю ...)   -  person mhaller    schedule 20.11.2009
comment
Другой вопрос: используют ли ваши клиенты ваши артефакты в качестве зависимостей maven (в этом случае, OMG, они знают имя хоста архива: D)?   -  person Pascal Thivent    schedule 20.11.2009
comment
Да, они делают. Я хотел бы, чтобы "общественный" помпон был чистым. Я не люблю дистрибутивы, отравленные внутренними вещами, например. когда проекты забывают удалить свои скрытые папки .svn и тому подобное. Он должен быть максимально чистым, так как это продукт. Для проекта OSS или хобби-проекта мне было бы все равно.   -  person mhaller    schedule 20.11.2009
comment
Стоит отметить, что для проекта с открытым исходным кодом очень важна информация о разработчиках, scm, системе отслеживания проблем и т. д. Это упрощает общение, а также открывает ворота для дополнительных функций. См., например, материализацию рабочей области, поддерживаемую m2eclipse. jroller.com/eu/entry/maven_project_materialization   -  person Eugene Kuleshov    schedule 06.12.2009


Ответы (3)


Я не знаю идеального решения для вашей проблемы, но некоторые вещи можно сделать. Это хаки, но они могут помочь.
Во-первых, извлеките личную информацию из pom (например, scm, имена разработчиков и т. д.). Для метаданных scm это будет:

<scm>
   <connection>${my.scm.connection}</connection>
   <developerConnection>${my.scm.developerConnection}</developerConnection>   
   <url>${my.scm.url}</url>
</scm>

Во-вторых, переместите свойства в файл настроек, поместив их в профиль. В файле настроек вы также можете «скрыть» личный репозиторий вашей компании. Если вам необходимо поделиться файлом profiles/settings.xml с другими пользователями, попробуйте использовать файл глобальных настроек, работающий под управлением mvn -gs path_to_global_settings, или подготовьте обычную установку Maven с этими подготовленными настройками.
Родительский раздел pom, к сожалению, должен остаться нетронутым.

person cetnar    schedule 04.12.2009
comment
Да, но см.: stackoverflow.com/questions/3683543/ - person Cornel Masson; 10.09.2010

Плагин выпуска не имеет встроенной поддержки для этого, насколько мне известно. На ум приходят две возможности:

Опция 1:

  • Не включайте pom в свои банки — вы можете управлять этим с помощью параметра «архив» в файле баночная цель. <archive><addMavenDescriptor>false</addMavenDescriptor></archive>
  • Напишите программу для удаления ненужных элементов в опубликованном POM. Вам нужно будет сделать это между выпуском: подготовка и выпуск: выполнение, что, вероятно, будет работать, только если у вас есть поддержка в вашем SCM для изменения тегов после создания, или выполните изменение под другим тегом/веткой, а затем выполните выпуск: выполнить из там.

Я думаю, что вариант 1 отвратительный.

Вариант 2:

  • попробуйте использовать параметр prepareGoals для плагина выпуска. Если вы можете написать манипулирование pom как действия maven, может быть сделать это таким образом.

Я думаю, что вариант 2 сложнее.

Если ничего из этого не работает, вам, вероятно, придется использовать что-то вроде release:stage и выполнить очистку вручную, но вы все равно захотите исключить POM из содержимого jar.

person Zac Thompson    schedule 02.12.2009

Для этого вы создадите свой собственный архетип и опубликуете его. Затем ваши пользователи смогут получить архетип и настроить свой собственный проект на основе вашего архетипа.

Архетип — это очень простой плагин, который содержит прототип проекта, который вы хотите создать.

Чтобы создать новый проект на основе архетипа, нужно вызвать mvn archetype:generate цель, например:

  mvn archetype:generate                              \
  -DarchetypeGroupId=<archetype-groupId>              \
  -DarchetypeArtifactId=<archetype-artifactId>        \ 
  -DarchetypeVersion=<archetype-version>              \
  -DgroupId=<my.groupid>                              \
  -DartifactId=<my-artifactId>
person Tom    schedule 21.11.2009
comment
Это не то, о чем я просил. Я попросил очистить pom.xml от артефактов, которые выпускаются. - person mhaller; 21.11.2009
comment
Что ж, если вы не хотите распространять файлы дескрипторов maven с самоописанием, просто исключите их из своего артефакта, например. с помощью тега addMavenDescriptor›false/addMavenDescriptor›. Я вижу здесь только три сценария: либо кому-то в вашей среде нужно пересобрать артефакт, тогда он должен иметь доступ к полным файлам дескрипторов, либо кто-то извне хочет настроить тот же проект в другой среде и поэтому должен создать свой собственный набор файлов дескрипторов из архетипа, или у нас есть конечный пользователь, которому нужен только простой артефакт. - person Tom; 22.11.2009
comment
Действительно, я говорю о сценарии 3: конечный пользователь, который хочет иметь артефакт, включая его pom.xml (для зависимостей, информации о проекте и т. д.), но поскольку ему не нужно пересобирать проект, нет необходимости для публикации информации о сборке, содержащейся в pom.xml - person mhaller; 22.11.2009
comment
Мне все еще трудно понять необходимость оценки pom.xml конечным пользователем; от него не требуется этого делать... Но в любом случае вы, вероятно, могли бы достичь своей цели, настроив свой проект как многомодульный проект и включив свои частные элементы только в родительский pom.xml, а затем используя наследование, чтобы сделать их доступными детям pom.xml. Распространяемый артефакт будет поставляться только с дочерним файлом pom.xml. - person Tom; 23.11.2009
comment
@Tom: это приведет к ошибкам в пользовательской среде IDE, поскольку maven не сможет найти (неопубликованный) родительский pom, на который все еще ссылаются в модуле pom.xml из-за наследования. - person mhaller; 30.11.2009