typescript-generatorプラグインでJavadocからTSDocを生成するとWindows環境でエラーとなった

前回の続き。

JavadocからTSDoc変換をできるようにしたが、運用しているとJavadoc出力時にエラーが出る場合があったのでメモ。

Windowsでエラーが発生する

特定の端末で「docletクラスcom.github.markusbernhardt.xmldoclet.XmlDocletが見つかりません」が発生し、Javadoc出力に失敗した。

いずれもWindows端末で、Gradleキャッシュへのパスに全角文字が含まれていた(Windowsのユーザー名が全角だった)。

javadoc.optionsUTF-8で出力されるが、 javadoc コマンドではデフォルトエンコーディングであるWindows-31Jで読み込まれるため、パスが文字化けしてしまいJARの読み込みに失敗していた模様。

javadocコマンドでファイル指定する際には文字コード指定ができないようで、GradleのJavadocタスクでもオプションファイルのエンコーディング指定はなさそう。 options.encoding は指定できるが、出力されるXMLファイルのエンコーディング指定だった。

また、ファイル内にはJavaファイルへのパスも出力されるため、ソースファイルのパスに全角文字が含まれる場合も失敗すると思われる。

プロジェクト保存先に全角文字が含まれないようにし、またJARは以下のように build ディレクトリ配下にコピーするよう変更して対応した。

configurations {
  xmlDoclet
}

dependencies {
  xmlDoclet 'com.github.markusbernhardt:xml-doclet:1.0.5'
}

final def tsOutputDir = 'build/typescript-generator'
final def tsXmlDocletDir = "${tsOutputDir}/xml-doclet"

task xmlDoclet(type: Javadoc) {
  // JARファイルをコピー
  def copyDir = "${tsOutputDir}/jar/doclet"
  (copyDir as File).mkdirs()

  def docletPaths = configurations.xmlDoclet.files.collect {
      def jarFile = new File("${copyDir}/${it.name}")
      jarFile << it.readBytes()
      return jarFile
  }

  source = sourceSets.main.allJava
  destinationDir = (tsXmlDocletDir as File).absoluteFile
  title = null
  options.noTimestamp = false
  options.encoding = 'UTF-8'
  options.showAll()
  options.doclet = 'com.github.markusbernhardt.xmldoclet.XmlDoclet'
  options.docletpath = docletPaths // コピー後のJARを指定
}

振り返り

Windowsのユーザー名に全角文字はやめておいたほうがいいね...