2015-05-07 6 views
0

Возможно ли запустить команды mvn, если на целевой машине нет maven? Я знаю, что это странно.Как запустить mvn, если на целевой машине нет maven

Возможно ли это с помощью какого-либо инструмента/утилиты-обертки, который имеет инструменты maven/etc, встроенные в инструмент/утилиту обертки?

Это то, чего я пытаюсь достичь. Использование Ansible (и Maven) для получения артефакта в заданную папку с удаленного сервера Artifactory.

  1. Я хочу загрузить артефакт из Artifactory.
  2. На целевой машине не установлено maven (mvn).
  3. Если я создаю небольшой скрипт оболочки liner, тогда мне приходится иметь дело со всеми репозиториями один за другим, то есть в некотором порядке (то есть сначала просматривать репозиторий релиза, затем снижаться до моментального снимка и т. Д. Или наоборот).

    (WGET http://myArtifactoryServer:somePort/artifactory/libs-snapshot-local/com/company/product/artifactName/version/artifactNameVersion.extension || WGET http://myArtifactoryServer:somePort/artifactory/libs-stage-local/com/company/product/artifactName/version/artifactNameVersion.extension || WGET http://myArtifactoryServer:somePort/artifactory/libs-alpha-local/com/company/product/artifactName/version/artifactNameVersion.extension || Wget http://myArtifactoryServer:somePort/artifactory/libs-beta-local/com/company/product/artifactName/version/artifactNameVersion.extension || Wget http://myArtifactoryServer:somePort/artifactory/libs-gamma-local/com/company/product/artifactName/version/artifactNameVersion.extension || Wget http://myArtifactoryServer:somePort/artifactory/libs-release-local/comcompany/product/artifactName/version/artifactNameVersion.extension)

мне было интересно, если есть какой-либо другой простой способ, я могу захватить артефакт по просто давая «виртуальное имя репо», то есть libs-release (который я создал и просматривал все репозитории физического релиза или просто использовал виртуальные репозитории компании-репозитария, так что мне не нужно называть каждое имя репо один за другим, используя || или Wget).

Мне не нужно использовать wget, если есть какой-либо другой способ. Maven автоматически находит артефакт и выполняет поиск во всех репозиториях (что вы определяете в settings.xml или pom.xml или в командной строке maven-dependency-plugin: get/copy)

Я также могу написать код в groovy, но затем groovy должен быть на целевом сервере.

+1

Вы могли бы посмотреть на Gradle. Преимущество этой темы заключается в том, что вы можете отправить ее с помощью сценария оболочки оболочки градиента и необходимого двоичного кода gradle. Целевая среда не требует установки градуировки. Gradle также правильно обрабатывает репозитории и т. Д. Посмотрите [здесь] (http: // gradle.org/docs/current/userguide/gradle_wrapper.html) для обертки. – u6f6o

+1

Я не на сто процентов уверен, чего вы пытаетесь достичь. [Capsule] (https://github.com/puniverse/capsule) - это проект для создания исполняемых банок, который также поддерживает загрузку зависимостей из хранилищ maven. –

+1

Вы можете использовать [обертку Maven] (https://github.com/takari/maven-wrapper). Но почему бы вам не создать архив tar.gz, содержащий все эти вещи через Maven, и загрузить только файл tar.gz? – khmarbaise

ответ

1

Late к партии, но я дам вам 3 варианта, тем не менее:

1) анзибль 2,0 как указано в другом месте. При ближайшем рассмотрении это не похоже на поддержку ~/.m2/settings.xml.

2) http://blog.sonatype.com/2011/01/downloading-artifacts-from-nexus-with-bash

3) анзибль роль, которую я написал и широко использовать. Он копирует артефакт на хост, где я выполняю загрузочную книгу (например, jenkins), а затем копирует артефакт на целевую машину. Это устраняет необходимость установки Maven на целевой машине, а также избавляет от необходимости подвергать Artifactory/нексус внутри моей огороженной среды:

- name: download artifact from a maven repo to a temporary dir 
    shell: mvn -B -U org.apache.maven.plugins:maven-dependency-plugin:2.10:copy \ 
    -Dartifact={{ item.groupId }}:{{ item.artifactId }}:{{ item.version }}:{{ item.type }} \ 
    -DoutputDirectory={{ role_path }}/files/target \ 
    -Dmdep.useBaseVersion=true 
    with_items: "{{ gav_list }}" 
    register: shell 
    changed_when: "'Copying {{ item.artifactId }}-' in shell.stdout" 
    connection: local 

- name: copy artifact (same version will be overwritten if checksums \ 
    are different e.g. new snapshot) 
    copy: 
    src: target/{{ item.artifactId }}-{{ item.version }}.{{ item.type }} 
    dest: {{ item.dest }} 
    owner: {{ item.owner | default('root') }} 
    group: {{ item.group | default('root') }} 
    mode: {{ item.mode | default(0644) }} 
    with_items: "{{ gav_list }}" 

В моих group_vars/окружающей среды я тогда сделать что-то вроде этого:

role_specific_gav_list: 
    - { groupId: 'org.postgresql', artifactId: 'postgresql', \ 
     version: '9.3-1102-jdbc41', type: 'jar', \ 
     dest: '{{ tomcat_home }}/lib' } 
# optionally owner, group and mode 

, который в свою очередь вызывается из site.yml или deploy.yml, передавая role_specific_gav_list роли gavdeploy:

hosts: tomcat 
    - { role: gavdeploy, gav_list: "{{ role_specific_gav_list }}" } 
+0

В Ansible playbook вы можете использовать модуль [maven_artifact] (http://docs.ansible.com/ansible/maven_artifact_module.html) вместо вызова 'mvn' или выполнения' wget' загрузки. – apa64

 Смежные вопросы

  • Нет связанных вопросов^_^