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="['"]DejaVu Sans['"]" replace="Arial"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['"]DejaVu Sans Mono['"]" replace="'Courier New'"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['"]DejaVu Serif['"]" replace="Arial"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?<=[\s,:])serif\b" replace="sans-serif"
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?<=[\s,:])Georgia,\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="['"]Times New Roman['"],\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?<=[\s,:])Times,\s*" replace=""
/>
<replaceregexp
file="${file}" flags="gsi" encoding="utf-8"
match="(?<=[\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>