it-swarm.com.ru

Maven не работает в Java 8, когда теги Javadoc неполны

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

Тем не менее, поскольку я перешел на Java 8 (1.8.0-ea-b90), Maven абсолютно строго относится к отсутствующим тегам документации и показывает мне множество ошибок Javadoc, связанных с проблемами Javadoc, когда я пытаюсь создать или установить проект, в котором Javadoc отсутствует. "идеально". Некоторые проекты, которые я пытаюсь скомпилировать и установить в своем локальном репозитории, являются сторонними проектами, над которыми я не имею контроля. Таким образом, обходной путь простого исправления всех Javadocs во всех этих проектах не представляется возможным в моем сценарии.

Это небольшая часть вывода, который я вижу, когда выполняю mvn clean package install в моем проекте:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.026s
[INFO] Finished at: Mon Apr 08 21:06:17 CEST 2013
[INFO] Final Memory: 27M/437M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.Apache.maven.plugins:maven-javadoc-plugin:2.9:jar (attach-javadocs) on project jpc: MavenReportException: Error while creating archive:
[ERROR] Exit code: 1 - /Users/sergioc/Documents/workspaces/heal/jpc/src/main/Java/org/jpc/engine/prolog/PrologDatabase.Java:10: error: @param name not found
[ERROR] * @param terms the terms to assert
[ERROR] ^
[ERROR] /Users/sergioc/Documents/workspaces/heal/jpc/src/main/Java/org/jpc/engine/prolog/PrologDatabase.Java:11: warning: no description for @return
[ERROR] * @return
[ERROR] ^

Плагин Javadoc Maven настроен так в моем POM:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Как я уже говорил, все работает нормально, если я вернусь к Java 7. Может быть, это ошибка, связанная с работой Maven в Java 8? Как я могу заставить его работать (то есть иметь возможность собрать Javadoc проекта и установить его код в моем локальном хранилище) с Java 8?.. Я проверил как Maven 3.0.3 и 3.0.5 в OSX.

Обновление:

Если я изменю свою конфигурацию плагина Javadoc с помощью <failOnError>false</failOnError> (спасибо Мартину):

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Затем проект устанавливается в моем локальном хранилище. Тем не менее, Javadoc JAR по-прежнему не генерируется.

Фрагмент вывода, который я вижу в консоли с этой новой конфигурацией:

[ОШИБКА] MavenReportException: ошибка при создании архива: выход код: 1 - /Users/....Java:18: предупреждение: нет @param ... Командная строка было:/Библиотека/Java/Home/bin/javadoc @options @packages

Обратитесь к сгенерированным файлам Javadoc в «/Users/sergioc/Documents/workspaces/heal/minitoolbox/target/apidocs' реж.

в org.Apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine (AbstractJavadocMojo.Java:5043) в org.Apache.maven.plugin.javadoc.AbstractJavadocMojo.executeReport (AbstractJavadocMojo.Java:1990) в org.Apache.maven.plugin.javadoc.JavadocJar.execute (JavadocJar.Java:181) в org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.Java:101) в org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:209) в org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:153) в org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:145) в org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.Java:84) в org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.Java:59) в org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild (LifecycleStarter.Java:183) в org.Apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.Java:161) в org.Apache.maven.DefaultMaven.doExecute (DefaultMaven.Java:320) в org.Apache.maven.DefaultMaven.execute (DefaultMaven.Java:156) в org.Apache.maven.cli.MavenCli.execute (MavenCli.Java:537) в org.Apache.maven.cli.MavenCli.doMain (MavenCli.Java:196) в org.Apache.maven.cli.MavenCli.main (MavenCli.Java:141) в Sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в Sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.Java:57) в Sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.Java:43) на Java.lang.reflect.Method.invoke (Method.Java:491) на org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.Java:290) в org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.Java:230) в org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.Java:409) в org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.Java:352)

Любой обходной путь о том, как собрать источники, установить проект и сгенерировать Javadoc JAR за один шаг, как это работало с Java 7?

283
Sergio

Лучшее решение было бы исправить ошибки Javadoc. Если по какой-либо причине это невозможно (например, автоматически сгенерированный исходный код), вы можете отключить эту проверку.

DocLint - это новая функция в Java 8 , которая представлена ​​в виде:

Предоставить средство для обнаружения ошибок в комментариях Javadoc в начале цикл разработки и таким образом, что легко связать обратно с исходный код.

Это включено по умолчанию, и перед генерацией Javadocs будет выполнено множество проверок. Вы должны отключить это для Java 8, как указано в этой теме . Вам придется добавить это в вашу конфигурацию maven:

<profiles>
  <profile>
    <id>Java8-doclint-disabled</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>
    <properties>
      <javadoc.opts>-Xdoclint:none</javadoc.opts>
    </properties>
  </profile>
</profiles>
<build>
  <plugins>
    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.9</version>
        <executions>
            <execution>
                <id>attach-javadocs</id>
                <goals>
                    <goal>jar</goal>
                </goals>
                <configuration>
                    <additionalparam>${javadoc.opts}</additionalparam>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <reportPlugins>
            <plugin>
              <groupId>org.Apache.maven.plugins</groupId>
              <artifactId>maven-javadoc-plugin</artifactId>
              <configuration>
                <additionalparam>${javadoc.opts}</additionalparam>
              </configuration>
            </plugin>
          </reportPlugins>
        </configuration>
      </plugin>
   </plugins>
</build>

Для maven-javadoc-plugin 3.0.x: Replace

<additionalparam>-Xdoclint:none</additionalparam>

с

<doclint>none</doclint>
349
Subhas

Самый простой подход к работе с Java 8 и Java 7 - использовать профиль в сборке:

<profiles>
  <profile>
    <id>doclint-Java8-disable</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>

    <build>
      <plugins>
        <plugin>
          <groupId>org.Apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <configuration>
            <additionalparam>-Xdoclint:none</additionalparam>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>
93
ankon

Вот самый краткий способ, которым я знаю, игнорировать предупреждения doclint независимо от используемой версии Java. Нет необходимости дублировать конфигурацию плагина в нескольких профилях с небольшими изменениями.

<profiles>
  <profile>
    <id>doclint-Java8-disable</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>
    <properties>
      <javadoc.opts>-Xdoclint:none</javadoc.opts>
    </properties>
  </profile>
</profiles>

<build>
  <plugins>
    <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.9.1</version>
      <executions>
        <execution>
          <id>attach-javadocs</id> <!-- The actual id should be apparent from maven output -->
          <configuration>
            <additionalparam>${javadoc.opts}</additionalparam>
          </configuration>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
</build>

Протестировано на Oracle/open jdk 6, 7 и 8.

56
Oliver Gondža

Добавьте в раздел глобальных свойств в файле pom:

<project>
    ...
    <properties>
        <additionalparam>-Xdoclint:none</additionalparam>
    </properties>

Общее решение, представленное здесь в других ответах (добавление этого свойства в разделе плагинов), по какой-то причине не сработало. Только установив его глобально, я смог бы успешно построить javadoc jar.

37
zapp

Самое короткое решение, которое будет работать с любой версией Java:

<profiles>
    <profile>
        <id>disable-Java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <additionalparam>-Xdoclint:none</additionalparam>
        </properties>
    </profile>
</profiles>

Просто добавьте это в свой POM, и все готово.

Это в основном ответ @ ankon plus ответ @ zapp .


Для пользователей maven-javadoc-plugin 3.0.0:

Замещать

<additionalparam>-Xdoclint:none</additionalparam> 

от 

<doclint>none</doclint>

34
Fred Porciúncula

Переопределение только конфигурации maven-javadoc-plugin, не устраняет проблему с mvn site (используется, например, на этапе выпуска). Вот что я должен был сделать:

<profile>
  <id>doclint-Java8-disable</id>
  <activation>
    <jdk>[1.8,)</jdk>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <additionalparam>-Xdoclint:none</additionalparam>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <reportPlugins>
            <plugin>
              <groupId>org.Apache.maven.plugins</groupId>
              <artifactId>maven-javadoc-plugin</artifactId>
              <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
              </configuration>
            </plugin>
          </reportPlugins>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>
30
Jakub Skoczen

Я не думаю, что просто отключение DocLint является хорошим решением, по крайней мере, на длительный срок. Хорошо, что Javadoc стал немного более строгим, поэтому правильный способ исправить проблему сборки - это исправить основную проблему. Да, в конечном итоге вам нужно будет исправить эти файлы исходного кода.

Вот вещи, на которые стоит обратить внимание:

  • Неверно сформированный HTML (например, отсутствующий конечный тег, неэкранированные скобки и т.д.)
  • Неверный {@link }s. (то же самое касается похожих тегов, таких как @see)
  • Неверные значения @author. Раньше это принималось: @author John <[email protected]>, но уже не так из-за неэкранированных скобок.
  • Таблицы HTML в Javadoc теперь требуют сводки или подписи. Смотрите этот вопрос для объяснения.

Вам просто нужно будет исправить файлы исходного кода и продолжать собирать Javadoc, пока он не сможет работать без сбоев. Громоздко да, но лично мне нравится, когда я довел свои проекты до уровня DocLint, потому что это означает, что я могу быть более уверен в том, что Javadoc, который я создаю, на самом деле то, что я намерен.

Конечно, есть проблема, если вы генерируете Javadoc для некоторого исходного кода, который вы не создали самостоятельно, например, потому что он исходит из какого-то генератора кода, например wsimport . Странно, что Oracle не подготовил свои собственные инструменты для соответствия JDK8 до фактического выпуска JDK8. Кажется, это не будет исправлено до Java 9 . Только в этом конкретном случае я предлагаю отключить DocLint, как описано в другом месте на этой странице.

28
peterh

Вы можете попробовать установить для свойства failOnError (см. документация плагина ) значение false:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
              <failOnError>false</failOnError>
            </configuration>
        </execution>
    </executions>
</plugin>

Как видно из документов, значением по умолчанию является true.

18
Martin Ellis

Так как это зависит от версии вашего JRE, которая используется для запуска команды maven, вы, вероятно, не хотите отключать DocLint по умолчанию в вашем pom.xml

Следовательно, из командной строки вы можете использовать ключ -Dadditionalparam=-Xdoclint:none.

Пример: mvn clean install -Dadditionalparam=-Xdoclint:none

17
My-Name-Is

Имя свойства конфигурации было изменено в последней версии maven-javadoc-plugin, которая является 3.0.0. 

Следовательно, <extraparam> не будет работать. Поэтому мы должны изменить его, как показано ниже.

   <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
         <doclint>none</doclint>
      </configuration>
  </plugin>
8
Balachandar

Итак, сэкономьте несколько часов, которые я не делал, и попробуйте это, если кажется, что это не работает:

 <additionalJOption>-Xdoclint:none</additionalJOption>

Тег изменен для более новых версий. 

2
rawrintheclouds

Начиная с maven-javadoc-plugin 3.0.0 вы должны были использовать AdditionalJOption , чтобы установить дополнительную опцию Javadoc, поэтому, если вы хотите, чтобы Javadoc отключил doclint, вы должны добавить следующее свойство. 

<properties>
    ...
    <additionalJOption>-Xdoclint:none</additionalJOption>
    ...
<properties>

Вы должны также упомянуть версию maven-javadoc-plugin как 3.0.0 или выше. 

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>    
</plugin>
2
amanzoor

Добавлено ниже

Не Java_TOOL_OPTIONS = -DadditionalJOption = -Xdoclint: нет

в задание Jenkins конфигурация> Среда сборки> Добавление переменных среды в процесс сборки> Свойства Содержимое

Решил мою проблему построения кода через Jenkins Maven :-)

2
snj

Я не уверен, поможет ли это, но даже недавно я столкнулся с точно такой же проблемой с oozie-4.2.0 version. После прочтения вышеупомянутых ответов я только что добавил опцию maven через командную строку, и она сработала для меня. Итак, просто делюсь здесь.

Я использую Java 1.8.0_77 , не пробовал с Java 1.7 

bin/mkdistro.sh -DskipTests -Dmaven.javadoc.opts = '- Xdoclint: -html'  

2
Raghu Kumar

Я хотел бы добавить понимание других ответов

В моем случае 

не -Xdoclint: нет

Не сработало.

Начнем с того, что в моем проекте мне вообще не нужен был Javadoc. Только некоторые необходимые плагины получили зависимость от времени сборки.

Итак, самым простым способом решения моей проблемы было: 

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>
1
mpasko256

Чтобы игнорировать отсутствующие теги @param и @return, достаточно отключить группу missingdoclint . Таким образом, Javadoc будет по-прежнему проверяться на наличие проблем более высокого уровня и синтаксиса:

    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <doclint>all,-missing</doclint>
        </configuration>
    </plugin>

Обратите внимание, что это для плагина версии 3.0 или новее.

1
gjoranv

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

Вот что работает для меня:

export Java_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

А затем запустите сборку Maven, любую сборку дистрибутива Linux и т.д. Приятно, что для этого не требуется модификация файлов Maven config - я не мог этого сделать, поскольку моей целью было перестроить группу из Centos Пакеты об/мин, поэтому пришлось идти очень глубоко.

0
Mariusz Borsa