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