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

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

Однако, поскольку я перешел на Java 8 (1.8.0-ea-b90), Maven абсолютно строг в отношении отсутствия тегов документации и показывает мне много ошибок 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.

UPDATE:

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

<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>

Затем проект устанавливается в моем локальном репозитории. Однако JAR Javadoc все еще не генерируется.

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

[ERROR] MavenReportException: ошибка при создании архива: выход код: 1 -/Users/....java:18: warning: no @param... Командная строка был:/Library/Java/Главная/bin/javadoc @options @packages

Обратитесь к сгенерированным файлам Javadoc в '/Users/sergioc/Документы/рабочие/заживают/minitoolbox/цель/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) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) at 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?

Ответ 1

Лучшее решение было бы исправить ошибки 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: заменить

<additionalparam>-Xdoclint:none</additionalparam>

с

<doclint>none</doclint>

Ответ 2

Самый простой способ получить работу с 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>

Ответ 3

Вот самый краткий способ, которым я знаю, игнорировать предупреждения 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 и 11.

Ответ 4

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

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

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

Ответ 5

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

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

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

Это в основном ответ @ankon плюс ответ @zapp.


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

замещать

<additionalparam>-Xdoclint:none</additionalparam>

от

<doclint>none</doclint>

Ответ 6

Только переопределение конфигурации 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>

Ответ 7

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

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

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

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

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

Ответ 8

Вы можете попробовать установить свойство 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.

Ответ 9

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

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

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

Ответ 10

Имя свойства конфигурации было изменено в последней версии 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>

Ответ 11

По Maven-JavaDoc-плагин 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>

Ответ 12

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

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

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

Ответ 13

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

В моем случае

-Xdoclint: нет

Не работает.

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

Итак, самый простой способ решить мою проблему:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

Ответ 14

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

не JAVA_TOOL_OPTIONS = -DadditionalJOption = - Xdoclint: нет

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

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

Ответ 15

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

 <additionalJOption>-Xdoclint:none</additionalJOption>

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

Ответ 16

Чтобы игнорировать отсутствующие @param и @return, достаточно отключить missing группу документов. Таким образом, 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 или новее.

Ответ 17

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

Вот что у меня работает: -

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

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

Ответ 18

использование

/*
 * Comments
 */

Вместо

/**
 * Comments
 */