Maven javadoc Ricerca reindirizza a " / undefined/.." URL
Ho generato javadoc con javadoc maven plugin 3.0.1 e Java 9. Tuttavia, quando utilizzo la nuova funzionalità di ricerca e seleziono una classe, reindirizza a "File non trovato"...
C'è undefined
nell'url (ad esempio "../ target / sito / apidocs / undefined / com / mycompany / MyClass.html"), che se rimosso, carica la pagina correttamente.
Potresti per favore aiutarmi con la configurazione giusta per generare java doc (sbarazzati di questo undefined
), quindi la capacità di ricerca carica l'html la pagina va bene?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${version.maven-javadoc-plugin}</version>
<executions>
<execution>
<id>javadoc</id>
<goals>
<goal>javadoc</goal>
</goals>
<phase>prepare-package</phase>
<configuration>
<doclint>none</doclint>
<dependencySourceIncludes>
<dependencySourceInclude>com.some:some</dependencySourceInclude>
</dependencySourceIncludes>
<doctitle>Title - ${project.version}</doctitle>
<includeDependencySources>true</includeDependencySources>
<windowtitle>Title</windowtitle>
</configuration>
</execution>
</executions>
5 answers
Ha funzionato con l'aiuto della seguente opzione nella configurazione del plugin java doc maven
<additionalJOption>--no-module-directories</additionalJOption>
Questo è un po ' un trucco, ma come @Martin Goikha menzionato in la sua risposta, specificando --no-module-directories
interrompe qualsiasi link esterno alle classi standard a causa dei nomi dei moduli mancanti. Come l'OP ha menzionato in un commento, getURLPrefix(ui)
di search.js
è ciò che genera i nomi dei moduli. Quindi, dopo un po ' di scavo, ho scoperto che il problema può essere risolto aggiungendo questo alla fine di search.js
:
getURLPrefix = function(ui) {
return "";
};
Che essenzialmente sovrascrive la definizione di getURLPrefix
per restituire una stringa vuota no importa cosa. Poiché deve solo essere aggiunto alla fine di un file, dovrebbe essere abbastanza facile automatizzare con qualsiasi strumento di compilazione tramite codice o un comando.
Ad esempio, se si utilizza Gradle, è possibile aggiungere quanto segue a build.gradle
:
// Needed to fix Javadoc search
// See comments below
final JAVADOC_FIX_SEARCH_STR = '\n\n' +
'getURLPrefix = function(ui) {\n' +
' return \'\';\n' +
'};\n'
tasks.withType(Javadoc) {
// Link to external docs
options.with {
// Example: Java 11 API documentation
links 'https://docs.oracle.com/en/java/javase/11/docs/api/'
}
doLast {
// Append the fix to the file
def searchScript = new File(destinationDir.getAbsolutePath() + '/search.js')
searchScript.append JAVADOC_FIX_SEARCH_STR
}
}
Ogni file .html
generato da Javadoc contiene la seguente definizione di variabile:
var useModuleDirectories = true;
Che influenza il comportamento della funzione getURLPrefix()
in search.js
:
function getURLPrefix(ui) {
var urlPrefix="";
if (useModuleDirectories) {
...
}
return urlPrefix;
}
Pertanto, possiamo aggirare questo problema sovrascrivendo il valore di useModuleDirectories
con false
, il che è possibile specificando il seguente tag di script nell'opzione -bottom
:
<script>
if (typeof useModuleDirectories !== 'undefined') {
useModuleDirectories = false;
}
</script>
Si noti che è necessario specificare anche l'opzione --allow-script-in-comments
in modo che Javadoc non si lamenti dell'uso di <script/>
tag nei commenti.
Utilizzo del plugin Javadoc maven
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${javadoc.pluginVersion}</version>
<executions>
<execution>
<id>javadoc</id>
<goals>
<goal>javadoc-no-fork</goal>
<goal>jar</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<bottom>
<![CDATA[
<script>
if (typeof useModuleDirectories !== 'undefined') {
useModuleDirectories = false;
}
</script>
]]>
</bottom>
<additionalJOption>--allow-script-in-comments</additionalJOption>
Questo risolve effettivamente il collegamento alla" Ricerca"../indefinito/... problema. C'è tuttavia un brutto effetto collaterale: collegamenti a classi standard o interfacce dirette verso ad esempio https://docs.oracle.com/en/java/javase/12/docs/api/
... sarà rotto a causa dei nomi dei moduli mancanti.
Considera ad esempio i collegamenti a java.lang.String
che ora puntano erroneamente a https://docs.oracle.com/en/java/javase/12/docs/api/java/lang/String.html
piuttosto che verso https://docs.oracle.com/en/java/javase/12/docs/api/
java.base/java/lang/String.html
.
Aggiunta
<additionalJOption>-no-module-directories</additionalJOption>
Ha funzionato per me. con uno -
non --