2013-09-11 8 views
1

Доброе время!Jenkins Maven Plugin: Classloading Feature

Наша команда использует Maven. Один из модулей проекта имеет плагин (Maven-JiBX-плагин), который требует (для нашего сценария использования) зависимость от фирменной баночке:

 <plugin> 
      <groupId>org.jibx</groupId> 
      <artifactId>jibx-maven-plugin</artifactId> 
      <version>${jibx.version}</version> 
      <executions> 
       <execution> 
        <id>main-schemas</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>schema-codegen</goal> 
        </goals> 
        <configuration> 
         <schemaLocation> 
          ... 
         </schemaLocation> 
         <includeSchemas> 
          ... 
         </includeSchemas> 
         <customizations> 
          <customization>${basedir}/src/main/resources/customizations/customization.xml 
          </customization> 
         </customizations> 
         <verbose>true</verbose> 
        </configuration> 
       </execution> 
       <execution> 
        <id>bind</id> 
        <phase>process-classes</phase> 
        <goals> 
         <goal>bind</goal> 
        </goals> 
        <configuration> 
         <schemaBindingDirectory> 
          ${basedir}/src/main/resources/bindings 
         </schemaBindingDirectory> 
         <includeSchemaBindings> 
          <includeSchemaBinding>*.xml</includeSchemaBinding> 
         </includeSchemaBindings> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>${project.parent.groupId}</groupId> 
        <artifactId>proprietary-jar</artifactId> 
        <version>${project.parent.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Проблема в том, когда мы строим проект локально (и даже из командной строки на удаленном компьютере, где jenkins istalled), все строит успешно, но когда наш экземпляр jenkins пытается его построить, сборка выходит из строя с таким сообщением: «Unable to find class 'class-name-from-the-proprietary-jar'». Эта проблема возникла локально, прежде чем мы добавили зависимость плагина.

Похоже, что есть некоторая функция плагина jenkins maven, которая не разрешает зависимостей плагина или может быть какая-то известная особенность загрузки jenkins maven plugin (например, JiBX загружает проприетарные классы с такой конструкцией: SchemaRootBase.class.getClassLoader().loadClass(cname) Таким образом, чтобы указать зависимость для плагина, необходимо предоставить знания для него о необходимых классах). Может ли кто-нибудь, пожалуйста, предложить обходное решение?

UPDATE: оказалось, что переменная JAVA_HOME экземпляра Дженкинс установлен в /usr/java/jdk1.7.0_25, но в моей Maven-компилятора-плагин у меня есть <target>1.6</target>. Может быть, проблема в версии 1.7 java?

+0

Вы пробовали переехать из maven build в freestyle build? – radai

+0

нет у меня нет. На самом деле наша команда не имеет доступа к jenkins - мы можем только проверять статусы сборки и видеть журналы ... – Dmitry

+0

Я не думаю, что целевой параметр имеет к этому какое-либо отношение. я подозреваю, что вы действительно нашли проблему с поддержкой jenkins maven, но лучший способ проверить - попробовать переключить работу на фристайлную работу. можете ли вы, по крайней мере, попробовать точно такую ​​же сборку на машине jenkins, работающей как пользователь jenkins? Кроме того, вы абсолютно уверены, что вы и дженкинс используете ту же версию maven? – radai

ответ

1

Ну, наконец, я нашел ответ! Проблема не в Дженкинсе, а в самом Maven.

ВНИМАНИЕ: Проходят информация проверяется только для Maven 2.

Оказалось, что, когда у вас есть Мультиконтроллер проект и несколько модулей используют тот же плагинразличными зависимостей), Maven получит зависимости, установленные для первый плагин (я имею в виду, что плагин находится в первом модуле, который Maven строит с помощью этого плагина) и использовать их для других плагинов, не переопределяя зависимость () значений.

Чтобы это пояснить, дается пример. Скажем, есть два модуля в Maven сборки - А и Б:

<modules> 
    <module>A</module> 
    <module>B</module> 
</modules> 

и модуль А имеет такой код в пом файла:

<plugin> 
    <dependencies> 
    <dependency> 
     <groupId>com.c</groupId> 
     <artifactId>D-module</artifactId> 
     <version>1</version> 
    </dependency> 
    </dependencies> 
    <groupId>org.jibx</groupId> 
    <artifactId>jibx-maven-plugin</artifactId> 
    <version>${jibx.version}</version> 
</plugin> 

и модуль B имеет такое код в пом файла:

<plugin> 
     <dependencies> 
     <dependency> 
      <groupId>com.c</groupId> 
      <artifactId>F-module</artifactId> 
      <version>1</version> 
     </dependency> 
     </dependencies> 
     <groupId>org.jibx</groupId> 
     <artifactId>jibx-maven-plugin</artifactId> 
     <version>${jibx.version}</version> 
    </plugin> 

оказывается, что, когда Maven строит модуль B будет использовать D-модуль, даже если вы указали зависимость F-модуля.

В нашем проекте мы сделали такой обходной путь: мы переместили объявление плагина к родителю POM в pluginManagement секции и объявлены зависимости D-модуль и F-модуль для плагина (также устранил эти зависимости от местные модулей). Хорошо, код довольно уродлив (имеет дочерние зависимости в родительском pom файл), но это работает!

Если кто-то поделился этой проблемой и сумел ее преодолеть, проконсультируйтесь с решением.

0

Попробуйте mvn clean install в вашем рабочем пространстве

Тогда вы должны иметь одну и ту же ошибку каждый где. Также попробуйте использовать ту же командную строку, которую использует Jenkins (если есть)

+0

Да, мы пробовали это (пожалуйста, см. Вопрос), но ошибок нет. Ошибки только повышаются, когда jenkins строит проект, поэтому я предполагаю, что есть особая вещь о его загрузке по классам ... – Dmitry

+0

Похоже, что завершение имени файла jar во время выполнения не преобразуется в то, что вам нужно. Либо переменная, которую вы использовали, либо написана неправильно, либо не может получить доступ к тому, что вы хотите, или может быть, что значение filename.jar, которое она имеет во время выполнения, недоступно в указанном каталоге –

+0

Archit Khosla, спасибо за интересную идею ! Я постараюсь проверить это. Кажется, имя файла правильно преобразовано, поскольку локально все правильно. Файл должен находиться в репозитории maven jenkins и в соответствии с тем, что до того, как эта функция JiBX была обнаружена, проблем не было, нет проблем с доступом к репозиторию, но я проверю это. – Dmitry

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