JDK8: Возвращение JDK7 ищет javadoc

Мне трудно читать новый внешний вид в JDK8 Javadoc по сравнению с JDK7. Вот соседний пример.

JDK7: JDK7 javadoc look

JDK8: JDK8 javadoc look

JDK8 занимает значительно больше места. Теперь он использует шрифт DejaVu там, где ранее использовался Arial. Для этого могут быть веские причины. Не знаю.

Моя самая большая проблема в разделах "Параметры" и "Броски", где больше нет визуального различия между аргументом и его описанием. Они оба в монофоническом шрифте. Я думаю, что писать описательный текст монофоническим шрифтом просто некрасиво. Моно-интервальный шрифт предназначен для имен идентификаторов, списков исходного кода и тому подобного. (не стесняйтесь не соглашаться).

Могу ли я вернуть стиль JDK7, продолжая использовать инструмент JDK8 javadoc?

Я надеялся на что-то вроде javadoc -stylesheet jdk7.css где jdk7.css было чем-то, включенным в JDK8. Также, если я решу настроить CSS самостоятельно (это не мое дело, но другого решения может не быть), я бы не хотел обеспечивать доступность новой таблицы стилей на каждом сервере сборки на нашем предприятии. Возможно, есть решение Maven для этого?

ВОЗМОЖНОЕ РЕШЕНИЕ?

Было предложено (ниже) использовать Javadoc css JDK7 с инструментом Javadoc JDK8, чтобы увидеть, приведет ли это к возвращению некоторого подходящего Javadoc.

Я сделал свой тест, проверив исходный код из проекта Apache Commons Lang. Я использую только исходный код, а не их POM. Это для того, чтобы я знал, что работаю на правильной основе.

Хорошо, сначала - для справки - здесь Javadoc, который был создан с помощью всего набора инструментов JDK7 (инструмент JDK7 javadoc, JDK7 css). Вот фрагмент POM:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <configuration>
                <stylesheetfile>${basedir}/src/main/css/jdk7javadoc.css</stylesheetfile>  
                <javadocExecutable>C:/Program Files/Java/jdk1.7.0_55/bin</javadocExecutable>   
            </configuration>
        </plugin>
    </plugins>
</build>  

и получившийся Javadoc: JDK7 javadoc, JDK7 css

Затем попытка использовать JDK7 css с инструментом JDK8 javadoc. Вот фрагмент POM:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <configuration>
                <stylesheetfile>${basedir}/src/main/css/jdk7javadoc.css</stylesheetfile>  
                <javadocExecutable>C:/Program Files/Java/jdk1.8.0_05/bin</javadocExecutable>   
            </configuration>
        </plugin>
    </plugins>
</build>  

и получившийся Javadoc: JDK8 javadoc, JDK7 css

Итак, как видите, эта стратегия не сработала для меня.

ОБНОВИТЬ

Я только что понял, что следствием этого изменения является то, что стало бессмысленно использовать разметку {@code } (или <code>) в описаниях параметров. Это не показывает в любом случае. Другими словами, если вам нравилось делать это в прошлом:

/**
* ...
* @param eName the name for the entity or <code>null</code> to use the default
* ...
*/

в этом просто нет смысла. Ваш null текст не будет выделяться в любом случае.

ОБНОВЛЕНИЕ 2019-04-19

Части проблем, упомянутых выше, были исправлены в JDK-8072052: часть <dd> списка <dl> в javadoc не должна быть моноширинным шрифтом. Исправлено в Java 9 и выше, не перенесено в Java 8.

Ответ 1

Css, используемый в Java 7 Javadoc, можно найти здесь:

http://docs.oracle.com/javase/7/docs/api/stylesheet.css

Затем вы можете использовать атрибут stylesheetfile из командной строки javadoc или ant или maven

из командной строки:

%javadoc -stylesheetfile <path> ...

в ant:

<javadoc 
        ....
        stylesheetfile="/path/to/stylesheet.css"
        />      

в Maven (см. страницу конфигурации таблицы стилей Maven для более подробной информации):

<reporting> (or <build>)
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        ...
        <configuration>
          <stylesheetfile>${basedir}/path/to/your/stylesheetfile.css</stylesheetfile>
          ...
        </configuration>
      </plugin>
    </plugins>
    ...
  </reporting> (or </build>) 

UPDATE

Стивен Коулборн опубликовал статью о других нарушениях Javadoc в Java 8 здесь. По-видимому, теперь doclint применяет соответствие HTML 4 и не свяжется, если ссылка сломана или не соответствует 100% HTML 4. Вы можете отключить ее с помощью -Xdoclint:none в качестве дополнительного параметра.

<plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <configuration>
        <additionalparam>-Xdoclint:none</additionalparam>
      </configuration>
    </plugin>
 </plugins>

Что касается тегов <code> в описаниях параметров, я тоже это видел. Похоже, что описания параметров в javadoc теперь всегда моноширины, поэтому вам больше не нужны теги кода?

Ответ 2

Вы можете получить стандартный JDK 8 stylesheet.css и исправить его очень быстро, а затем вы можете поместить его в некоторую исходную папку и сообщить javadoc, чтобы использовать его со своей опцией stylesheetfile. Проблема в том, что нет гарантии обратной совместимости, сгенерированный HTML-код иногда меняется. Это произошло с JDK 7, а теперь с JDK 8. И тогда вам часто приходится учитывать, что только потому, что JDk 8 отсутствует, некоторые могут построить ваш проект с помощью JDK 7...

Во всяком случае, я обнаружил, что мы строим под JDK 8 или более поздней версией, и в этом случае я применил regexp замены на stylesheet.css, во время сборки. Это было легко для меня, поскольку этот старый проект использует Ant, а не Maven. Чтобы узнать, какие изменения внесены, соответствующая часть:

<target name="_fixJDK8JavadocCSS" depends="_rawJavadoc" if="atLeastJDK8">
  <property name="file" value="build/api/stylesheet.css" />
  <echo>Fixing JDK 8 CSS in ${file}</echo>

  <!-- Tell that it modified: -->
  <replaceregexp
      file="${file}" flags="gs" encoding="utf-8"
      match="/\* (Javadoc style sheet) \*/" replace="/\* \1 - JDK 8 usability fix regexp substitutions applied \*/"
  />

  <!-- Remove broken link: -->
  <replaceregexp
      file="${file}" flags="gs" encoding="utf-8"
      match="@import url\('resources/fonts/dejavu.css'\);\s*" replace=""
  />

  <!-- Font family fixes: -->
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="['&quot;]DejaVu Sans['&quot;]" replace="Arial"
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="['&quot;]DejaVu Sans Mono['&quot;]" replace="'Courier New'"
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="['&quot;]DejaVu Serif['&quot;]" replace="Arial"
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="(?&lt;=[\s,:])serif\b" replace="sans-serif"
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="(?&lt;=[\s,:])Georgia,\s*" replace=""
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="['&quot;]Times New Roman['&quot;],\s*" replace=""
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="(?&lt;=[\s,:])Times,\s*" replace=""
  />
  <replaceregexp
      file="${file}" flags="gsi" encoding="utf-8"
      match="(?&lt;=[\s,:])Arial\s*,\s*Arial\b" replace="Arial"
  />

  <!-- "Parameters:", "Returns:", "Throws:", "Since:", "See also:" etc. fixes: -->
  <property name="ddSelectorStart" value="(?:\.contentContainer\s+\.(?:details|description)|\.serializedFormContainer)\s+dl\s+dd\b.*?\{[^\}]*\b" />
  <property name="ddPropertyEnd" value="\b.+?;" />
  <!-- - Put back description (dd) indentation: -->
  <replaceregexp
      file="${file}" flags="gs" encoding="utf-8"
      match="(${ddSelectorStart})margin${ddPropertyEnd}" replace="\1margin: 5px 0 10px 20px;"
  />
  <!-- - No monospace font for the description (dd) part: -->
  <replaceregexp
      file="${file}" flags="gs" encoding="utf-8"
      match="(${ddSelectorStart})font-family${ddPropertyEnd}" replace="\1"
  />
</target>

Итак, точка - это регулярное выражение выше, которое можно применить с помощью ant, sed, Notepad ++ и т.д. (для не Ant не забудьте решить &...; и ${...} части).

Причина, по которой я использовал regexp, заключается в том, что я надеюсь, что он сможет пережить некоторые изменения в HTML и, следовательно, в стандартном CSS... но, возможно, мне следует просто использовать полученный CSS, я не знаю. Или я должен выбрать использование стороннего doclet, где, таким образом, я могу управлять используемой версией.

Ответ 3

Я использую таблицу стилей, чтобы переопределить некоторые определения CSS JDK8, чтобы они выглядели в основном как JDK7 Javadoc.

@import "stylesheetOrig.css";

body {
   font-family: Arial, Helvetica, sans-serif;
   font-size: 12px; }

pre {
   font-family: monospace;
   font-size: 12px; }

code, tt, dt code, table tr td dt code  {
   font-family: monospace;
   font-size: 12px; }

.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
   font-size: 13px; }

.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
   margin-left: 20px;
   font-size: 12px;
   font-family: inherit; }

div.block {
   font-size: 12px;
   font-family: inherit; }

h4 {
   font-size: 15px; }

.memberSummary caption {
   padding-top: 0; }

div.summary th {
   border: 1px solid #9eadc0; }
div.summary td {
   border-left: 1px solid #9eadc0;
   border-right: 1px solid #9eadc0; }
div.summary th.colFirst,
div.summary td.colFirst {
   border-right: none; }
div.summary th.colLast,
div.summary td.colLast {
   border-left: none; }
div.summary table {
   border-bottom: 1px solid #9eadc0;
   margin-bottom: 15px; }
div.summary ul.blockList ul.blockList ul.blockList {
   margin-top: 20px; }
ul.blockList ul.blockList li.blockList,
ul.blockList ul.blockList ul.blockList li.blockList,
ul.blockList ul.blockList ul.blockListLast li.blockList {
   border: 1px solid #9eadc0; }
div.summary ul.blockList ul.blockList ul.blockList li.blockList h3,
div.details ul.blockList ul.blockList ul.blockList li.blockList h4,
div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
   border-bottom: 1px solid #9eadc0; }

My Ant script переименовывает исходный stylesheet.css в stylesheetOrig.css и заменяет его новой версией (которая импортирует исходную версию):

<condition property="isJava8">
 <equals arg1="${ant.java.version}" arg2="1.8"/>
</condition>

<target name="-fixupJava8Javadoc" if="isJava8">
 <move file="target/apidocs/stylesheet.css" tofile="target/apidocs/stylesheetOrig.css"/>
 <copy file="src/doc/javadoc8OverrideStylesheet.css" tofile="target/apidocs/stylesheet.css"/>
</target>