[java] Javadoc 태그가 불완전한 경우 Java 8에서 Maven이 작동하지 않습니다

Maven을 사용하기 때문에 Javadoc 태그가 불완전한 로컬 리포지토리 프로젝트 (예 : 누락 된 매개 변수)에서 빌드하고 설치할 수있었습니다.

그러나 Java 8 (1.8.0-ea-b90)으로 마이그레이션했기 때문에 Maven은 문서 태그 누락에 대해 절대적으로 엄격하며 Javadoc이 아닌 프로젝트를 빌드하거나 설치하려고 할 때 Javadoc 문제와 관련된 많은 Javadoc 오류를 보여줍니다 “완전한”. 로컬 리포지토리에서 컴파일 및 설치하려는 일부 프로젝트는 내가 제어 할 수없는 타사 프로젝트입니다. 따라서이 모든 프로젝트에서 모든 Javadoc을 수정하는 해결 방법은 시나리오에서 실현 가능하지 않은 것 같습니다.

이것은 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로 돌아 가면 모든 것이 제대로 작동합니다. Java 8에서 실행되는 Maven과 관련된 버그입니까? Java 8에서 어떻게 작동합니까 (예 : 프로젝트의 Javadoc을 빌드하고 로컬 리포지토리에 코드를 설치할 수 있음)? OSX에서 Maven 3.0.3 및 3.0.5로 테스트했습니다.

최신 정보:

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>

그런 다음 프로젝트가 로컬 저장소에 설치됩니다. 그러나 Javadoc JAR은 여전히 ​​생성되지 않습니다.

이 새로운 구성으로 콘솔에 표시되는 출력 조각은 다음과 같습니다.

[오류] MavenReportException : 아카이브 작성 중 오류 : 종료 코드 : 1-/Users/….java:18 : 경고 : no @param … 명령 행 : / Library / Java / Home / bin / javadoc @options @ 패키지

‘/ Users / sergioc / Documents / workspaces / heal / minitoolbox / target / apidocs’디렉토리에서 생성 된 Javadoc 파일을 참조하십시오.

org.apache.maven.plugin의 org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeReport (AbstractJavadocMojo.java:1990)의 org.apache.maven.plugin의 org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine (AbstractJavadocMojo.java:5043)에서 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:101)의 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java의 .javadoc.JavadocJar.execute (JavadocJar.java:181) : 209) org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:153), org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:145) org.apache에 있습니다. org.apache.maven.lifecycle.internal.LifecycleModuleBuilder에서 maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:84).org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild (LifecycleStarter.java:183) org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:161)의 buildProject (LifecycleModuleBuilder.java:59) org.apache.maven.cli.MavenCli.execute (MavenCli.java의 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:156)에서 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:320)에서 : 537) 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) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:290) org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:230)에서 invoke (Method.java:491) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:409)에서 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:352)에서

소스를 빌드하고, 프로젝트를 설치하고, Java 7과 함께 작업 할 때 한 단계로 Javadoc JAR을 생성하는 방법에 대한 해결 방법이 있습니까?



답변

가장 좋은 해결책은 javadoc 오류를 수정하는 것입니다. 어떤 이유로 불가능한 경우 (예 : 자동 생성 소스 코드)이 검사를 비활성화 할 수 있습니다.

DocLint는 Java 8의 새로운 기능으로 다음과 같이 요약됩니다.

개발주기 초기에 소스 코드에 쉽게 다시 연결되는 방식으로 Javadoc 주석에서 오류를 감지하는 수단을 제공하십시오.

기본적으로 활성화되어 있으며 Javadoc을 생성하기 전에 많은 검사를 수행합니다. 이 스레드에 지정된 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.0+의 경우 :
바꾸기

<additionalparam>-Xdoclint:none</additionalparam>

<doclint>none</doclint>


답변

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>


답변

여기에 사용되는 Java 버전에 관계없이 doclint 경고를 무시하는 가장 간결한 방법이 있습니다. 약간의 수정으로 여러 프로파일에서 플러그인 구성을 복제 할 필요가 없습니다.

<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에서 테스트되었습니다.


답변

pom 파일의 전역 속성 섹션에 추가하십시오.

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

다른 답변 (플러그인 섹션에 해당 속성 추가)에서 여기에 제공된 일반적인 솔루션은 어떤 이유로 작동하지 않았습니다. 전역으로 설정해야만 javadoc jar를 성공적으로 빌드 할 수 있습니다.


답변

모든 Java 버전에서 작동하는 가장 짧은 솔루션 :

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

POM에 추가하기 만하면됩니다.

이것은 기본적으로 @ ankon ‘s answer + @ zapp ‘s answer 입니다.


maven-javadoc-plugin 3.0.0 사용자의 경우 :

바꾸다

<additionalparam>-Xdoclint:none</additionalparam>

으로

<doclint>none</doclint>


답변

DocLint를 끄는 것이 장기적으로는 좋은 해결책이라고 생각하지 않습니다. Javadoc이 조금 더 엄격 해 졌으므로 빌드 문제를 해결하는 올바른 방법 은 기본 문제해결하는 것입니다. 입니다. 예, 궁극적으로 해당 소스 코드 파일을 수정해야합니다.

이전에 피할 수 있었던 사항은 다음과 같습니다.

  • 잘못된 HTML (예 : 누락 된 종료 태그, 이스케이프 처리되지 않은 괄호 등)
  • 유효하지 않은 {@link }s. (와 같은 유사한 태그에도 동일 @see)
  • 유효하지 않은 @author값. 이것은 예전에는 받아 들여지지 @author John <john.doe@mine.com>않았지만 더 이상 이스케이프 처리되지 않은 대괄호 때문에 그렇게 받아 들여지지 않았습니다.
  • Javadoc의 HTML 테이블에 요약 또는 캡션이 필요합니다. 설명 은 이 질문 을 참조하십시오 .

소스 코드 파일을 수정하고 실패없이 빌드 할 수있을 때까지 Javadoc을 계속 빌드하면됩니다. 번거롭지 만 개인적으로 나는 프로젝트를 DocLint 레벨로 올릴 때 좋아한다. 왜냐하면 내가 생산하는 Javadoc이 실제로 내가 의도 한 것임을 확신 할 수 있기 때문이다.

물론 직접 생성하지 않은 일부 소스 코드에서 Javadoc을 생성하는 경우 문제가 있습니다 (예 : wsimport 와 같은 일부 코드 생성기에서 제공됨) . 오라클이 실제로 JDK8을 발표하기 전에 JDK8 준수를위한 자체 툴을 준비하지 않은 것이 이상합니다. Java 9까지는 수정되지 않는 것 같습니다 . 이 특별한 경우에만이 페이지의 다른 곳에 문서화 된 DocLint를 끄는 것이 좋습니다.


답변

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>