Jenkins не показывает ошибки компилятора maven

При создании нашего мультимодульного проекта maven 3 в Jenkins, если есть ошибка сборки, мы получаем это загадочное сообщение о том, что плагин компилятора maven не удался. Это только начало происходить в течение последней недели:

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:22.340s
[INFO] Finished at: Fri Feb 10 09:44:02 CET 2012
[INFO] Final Memory: 171M/318M
[INFO] ------------------------------------------------------------------------
mavenExecutionResult exceptions not empty
message : Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project me.activity.impl: Compilation failure
cause : Compilation failure
Stack trace : 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project me.activity.impl: Compilation failure
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
    at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:158)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:104)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:70)
    at hudson.remoting.UserRequest.perform(UserRequest.java:118)
    at hudson.remoting.UserRequest.perform(UserRequest.java:48)
    at hudson.remoting.Request$2.run(Request.java:287)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
    at java.util.concurrent.FutureTask.run(FutureTask.java:123)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
    at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
    at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516)
    at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 27 more
Maven schlug mit Fehlern fehl.
An attempt to send an e-mail to empty list of recipients, ignored.

При построении из командной строки мы получаем обычные ошибки сборки:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5:24.906s
[INFO] Finished at: Fri Feb 10 08:17:31 EST 2012
[INFO] Final Memory: 173M/328M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project me.activity.impl: Compilation failure: Compilation failure:
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1018,12] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[200,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[234,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[263,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[294,20] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[311,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1023,47] cannot find symbol
[ERROR] symbol  : variable ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1025,67] cannot find symbol
[ERROR] symbol  : variable ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :me.activity.impl

Мы используем maven-3.0.4 как для локальных сборок, так и для Jenkins. Версия Jenkins была 1.3ish, но я повысился до 1.450, чтобы увидеть, исчезнет ли проблема - это не так. Это произошло примерно в то время, когда мы перешли с maven-2.2.1 на maven-3.0.4, но я могу поклясться (хотя у меня нет доказательств), что я получал нормальные ошибки сборки на Jenkins сразу после обновления maven, поэтому я не думайте, что это, но это единственное изменение, которое я могу придумать, может вызвать это. Версия плагина компилятора 2.0.2.

Я видел подобное сообщение здесь, но его проблема связана с сборками eclipse, а не с Дженкинсом.

Ответы

Ответ 1

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


Устранение неполадок

(Пропустите, если вам неинтересно, как я понял это для своих настроек, но это может помочь вам. Решение 1 - это то, что вы хотите, если вы нетерпеливы.)

Как это началось...

Текущая рабочая директория активно развивающегося проекта начала выплевывать журналы, демонстрирующие это поведение сегодня, когда каких-либо ошибок не было. Я использовал Windows 7, Maven 3.0.4, плагин 2.4 компилятора и java (c) 1.6.0_31.

При достижении определенного подмодуля maven выплевывает некоторые сообщения об ошибках и отказывает сборку, за исключением того, что сообщения об ошибках не связаны (сообщая о использовании проприетарных API com.sun.*), и не было бы признаков фактической ошибки компиляции.

Вещи становятся странными...

В этот момент я нахожу этот поток, и я также пытаюсь перестроить с различными версиями java и версиями maven-compiler-plugin. Здесь интересная часть:

  • с компилятором-плагином 2.5, я бы получил аналогичную проблему и не был действительный отчет об ошибке;
  • с плагином 2.3 компилятора, я бы получил аналогичную проблему с бессмысленным сообщением об ошибке, сообщающим о недостающем пакете (который присутствует и в пути к классам, хотя!);
  • с плагином 2.3.2 компилятора, я бы получил аналогичную проблему с бессмысленным сообщением об ошибке, сообщающим о недостающем пакете (который присутствует и в пути к классам, хотя!) НО * * в другой точке ** в компиляции тестовых классов модуля (ранее это происходило при компиляции нормальных классов).

От Weird to Weirder

Подозрившись, я переключился на другой каталог с чистой проверкой проекта и переделал все.

Все работало FINE. Путаница и отчаяние здесь.

Итак, я понял, что работал над довольно огромным и сложным классом в другой рабочей области, в неисправном модуле. И я имею в виду довольно огромный, сложный и довольно плохо написанный. Тип зверя, который заставляет вас сказать своему боссу "пожалуйста, не заставляйте меня касаться этого", и это заставляет ваш ключ DELETE щекотать вас каждый раз, когда у вас есть несчастье бегать по нему в вашей среде IDE. На самом деле, эта штука так же похожа на потомство темного маржического эксперимента и странно неэтичного биоресурса, что вы задаетесь вопросом, не произошло ли это из RTC Wolfenstein или Doom, если антагонисты были битами кода. Класс, который вы не хотите оставлять в покое, чтобы закодировать по ночам, и для которого Sonar спокойно сообщает о нарушениях качества кода 1000, включая индексы сложности, которые заставляют вас задаться вопросом, действительно ли PMD, JDepend и другие инструменты не имеют ход в то же время).

Но я отвлекаюсь...

Я скопировал его на это чистое и, казалось бы, рабочее рабочее пространство (к счастью для меня это не повлияло на другие файлы, поэтому было довольно просто: просто скопировать).

Затем я перестраиваю с Maven, и он становится все расшатанным, когда он снова возвращается к модулю, содержащему этот файл, за исключением того, что на этот раз он выдает load ошибки stacktrace, которые не заканчиваются. Поэтому я хочу попробовать повторно запустить ту же сборку, на этот раз сохраняя вывод в файле журнала, чтобы иметь более пристальный взгляд и (здесь новая странная вещь, потому что пока это было не странно)... это снова не обнаруживает ошибок.

Итак, я полагаю, что что-то явно очень противно, потому что javac перебирается с тем, что выглядит как переполнение стека, и ищите бит stacktrace, который я видел в своем журнале в первый раз. Вот кусок этого (как я подозреваю, некоторые могут столкнуться с этим и найти этот ответ полезным):

[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:377)
[ERROR] at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1241)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1210)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1799)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:377)
[ERROR] at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1241)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1210)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1799)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522)

И Google красиво указывает мне на... StackOverflow, конечно:)

Компиляция Maven: сбой выполнения javac

Где я могу увидеть легкую вещь, чтобы попробовать (см. ниже).

Конечно, для устранения неполадок было бы проще облегчить, если бы во всех ситуациях и во всех случаях отображалась функция stacktrace, и было показано очевидное исключение StackOverflowException. Особенно учитывая, что в противном случае я уже видел эту ошибку и знаю, что это значит, но это намного сложнее понять, когда вы ** не можете видеть * ошибку.

Не знаю, почему Maven проглотил этот, но, может быть, javac просто разбился без предупреждения, и в управлении журналом произошла ошибка, и он не вымывается должным образом.

Это также объясняет, почему эта ошибка происходит относительно случайным образом: это повлияет на ваши аппаратные настройки, и небольшие изменения в классах javac передаются процессу.

Итак, теперь что??? Ну, если есть сумасшедшее исключение или исключение OutOfMemoryException, когда java пытается обработать ваш код, очевидно, вам нужно сделать что-то похожее на то, что объяснено ниже...


Решение

Решение 1 (также называемое "кратковременное/быстрое n-грязное/просим-делать-работать" )

Обновите настройки памяти. Самый простой способ - с чем-то вроде (для bash -подобной оболочки):

export MAVEN_OPTS="-Xss1024k -Xms512m -Xmx1024m"

BEWARE. Эти настройки будут зависеть от вашего оборудования платформы, очевидно (и от вашей оболочки).

В моем случае, я действительно имел обыкновение иметь:

export MAVEN_OPTS="-Xss128k -Xms384m -Xmx384m"

... потому что у меня довольно тяжелый проект и не такая рабочая станция, способная работать с памятью, поэтому мне нужно сжать каждый бит оперативной памяти, из которого я могу это сделать, чтобы иметь несколько экземпляров Eclipse, несколько серверов приложений и т.д.. Таким образом, мои JAVA_OPTS, ANT_OPTS и MAVEN_OPTS установлены с множеством опций, включая их.

Это не обязательно то, что вам нужно! По умолчанию xss для 64-битной JVM для Windows на самом деле 1024, поэтому я использую что-то значительно меньшее. Я просто говорю это, поскольку это может помочь другим в той же ситуации. Попытайтесь поднять его соответствующим образом и разумно для вас.

Итак, в конце концов, чтобы исправить эту конкретную проблему в моем проекте, мне пришлось изменить выше:

export MAVEN_OPTS="-Xss256k -Xms384m -Xmx384m"

И теперь все работает peachy.

Возможно, некоторые другие вещи для вас разные. Дайте мне знать.

 

Решение 2 (также называемое "long-term/zen" )

Вы знаете, что лучше, чем возиться с настройками памяти, которые другие не знают, чтобы возиться с ними и, возможно, не имеют возможности, и что ваши сборки менее переносимы? [аудитория кричит здесь]

Вы реорганизуете ад из этого приклада-уродливого класса, который заставляет javac плакать за свою маму.

Это так просто. Не тысячи и тысячи строк длинных классов, с сумасшедшими статическими инициализаторами, сверхтонкими методами и тому подобным. Если ваш код выглядит вам сложным, он уверен, что и для бедных javac.

Сохранить процесс javac сегодня: реорганизовать свой код!

Ответ 2

Используемая версия плагина maven для компилятора 2.3.2. На выходе ниже вы можете видеть, что я получаю ошибки, как вы ожидали.

07:16:37  [INFO] Copying 0 resource
07:16:37  [INFO] 
07:16:37  [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ fusion-common ---
07:16:38  [INFO] Compiling 49 source files to /opt/jss/hudson/work/jobs/FMWJavaCommon/workspace/target/classes
07:16:42  [INFO] -------------------------------------------------------------
07:16:42  mojoFailed org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-compile)
07:16:42  [ERROR] COMPILATION ERROR : 
07:16:42  [INFO] -------------------------------------------------------------
07:16:42  [ERROR] /opt/jss/hudson/work/jobs/FMWJavaCommon/workspace/src/main/java/au/gov/qld/jag/jss/fusion/services/InvokeAuditLoggerService.java:[107,8] cannot find symbol
07:16:42  symbol  : method setGeneratedTimestamp(javax.xml.datatype.XMLGregorianCalendar)
07:16:42  location: class au.gov.qld.jag.jss.fusion.services.client.auditservice.AuditLogType
07:16:42  [INFO] 1 error
0

Конфигурация pom для плагина

            <!-- Compiler Version to use for Compiling Java Code -->
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

Других специальных конфигураций нет. Я использую Hudson 2.2.0-BETA и плагин Hudson:: Maven (legacy) 2.2.0-BETA.

Ответ 3

Не уверен, что это исправит вашу проблему, но у меня была такая же проблема, потому что родительский pom имел определение плагина для плагина компилятора. Я скопировал одно и то же определение плагина в фактический проект pom. Это исправляет проблему для меня, т.е. Jenkins теперь правильно показывает ошибки компилятора. Не уверен, почему это устраняет проблему, но это так. Возможно, это связано с тем, что maven запускает процесс компиляции подмодулей, и этот терминал не передается на консоль jenkins. Я буду исследовать больше, когда я получу время.

Сообщите мне, если это сработает для вас. Я скопировал мое определение плагина ниже его довольно стандартного:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
</plugins>

Ответ 4

Вы должны проверить, где находится класс ActivityRuntimeType. Скорее всего, это не на пути компилятора или класса. Это обычно происходит, когда класс, от которого вы зависите, находится в зависимости, которая неожиданно изменяется.