- 投稿日:2020-02-16T23:00:33+09:00
Minecraft Mod 開発環境構築 (IntelliJ IDEA + Minecraft Forge 1.15.2) + Hello World Mod 作成
概要
- IntelliJ IDEA に Minecraft Mod の開発環境を構築して、シンプルな Hello World Mod を作成する
環境
- Minecraft 1.15.2
- Minecraft Forge 1.15.2-31.1.0
- macOS Catalina
- Java 8 (AdoptOpenJDK)
- IntelliJ IDEA 2019.3.1 (Community Edition)
IntelliJ IDEA に開発環境を構築
Java 8 のインストール
今回の開発環境では Java 11 以降がサポートされていないため、事前に Java 8 をインストールしておく必要がある。
参考: Java 8 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする - Qiita
Mdk (Mod Development Kit) のダウンロード
現時点 (2020年2月16日現在) の推奨環境である Minecraft Forge 1.15.2-31.1.0 の Mdk (Mod Development Kit) を Minecraft Forge からダウンロードする。
ダウンロードした forge-1.15.2-31.1.0-mdk.zip を展開する。
$ unzip forge-1.15.2-31.1.0-mdk.zip Archive: forge-1.15.2-31.1.0-mdk.zip inflating: gradlew inflating: gradlew.bat inflating: CREDITS.txt inflating: LICENSE.txt inflating: changelog.txt creating: gradle/ creating: gradle/wrapper/ inflating: gradle/wrapper/gradle-wrapper.properties inflating: gradle/wrapper/gradle-wrapper.jar inflating: .gitignore creating: src/ creating: src/main/ creating: src/main/java/ creating: src/main/java/com/ creating: src/main/java/com/example/ creating: src/main/java/com/example/examplemod/ inflating: src/main/java/com/example/examplemod/ExampleMod.java creating: src/main/resources/ inflating: src/main/resources/pack.mcmeta creating: src/main/resources/META-INF/ inflating: src/main/resources/META-INF/mods.toml inflating: build.gradle inflating: README.txt inflating: gradle.propertiesREADME.txt にセットアップ方法が載っている。
If you prefer to use IntelliJ:
1. Open IDEA, and import project.
2. Select your build.gradle file and have it import.
3. Run the following command: "gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux)
4. Refresh the Gradle Project in IDEA if required.参考: MinecraftForge/mdk at 1.15.x · MinecraftForge/MinecraftForge · GitHub
IntelliJ IDEA で Import Project
IntelliJ IDEA で Import Project にて展開したフォルダを指定してプロジェクトを作成する。
以下のようなメッセージが出力された場合は適切な Java のバージョンが設定されていない。
> Failed to apply plugin [id 'net.minecraftforge.gradle'] > Found java version null. Minimum required is 1.8.0_101. Versions 11.0.0 and newer are not supported yet.IntelliJ の設定 Preferences > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM にて Java 8 以降の JVM を指定する必要がある。
./gradlew genIntellijRuns
IntelliJ IDEA の Terminal などで ./gradlew genIntellijRuns を実行する。
$ ./gradlew genIntellijRunsここでも Java 8 以降が使われるため、必要に応じて設定をしておく。
参考: Java 8 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする - Qiita開発用 Minecraft Forge の起動
IntelliJ IDEA 右上にある Gradle Tool Window から Tasks > fg_runs > runClient を実行するか、または Terminal などから ./gradlew runClient を実行すると Minecraft が起動する。
「Mods」 をクリックすると Mdk に同梱されている Example Mod が読み込まれていることがわかる。
Example Mod について
Mdk には Mod 開発のサンプルとして Example Mod のソースコードが同梱されている。
ソースコード一覧。
- src/main/java/com/example/examplemod/ExampleMod.java
- src/main/resources/pack.mcmeta
- src/main/resources/META-INF/mods.toml
- build.gradle
MinecraftForge/mdk at 1.15.x · MinecraftForge/MinecraftForge · GitHub でソースコードの中身を確認することも可能。
Hello World Mod の作成
構築した開発環境上にて、シンプルな Hello World を実現する Mod を作成する。
ソースコード一覧
- src/main/java/com/example/HelloWorldMod.java
- src/main/resources/pack.mcmeta
- src/main/resources/META-INF/mods.toml
- build.gradle
src/main/java/com/example/HelloWorldMod.java
Mod のメイン処理を実行する Java のクラスを記述する。
package com.example; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("helloworldmod") // META-INF/mods.toml に記述した modId public class HelloWorldMod { public HelloWorldMod() { // MinecraftForge.EVENT_BUS で処理するイベントのハンドラメソッドを持つオブジェクト(this)を登録 MinecraftForge.EVENT_BUS.register(this); } /** * プレイヤーのログイン時に実行するイベントハンドラメソッド。 * メソッド名は任意のもので良い。 * * @param event PlayerLoggedInEvent オブジェクト */ @SubscribeEvent public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { PlayerEntity player = event.getPlayer(); BlockPos pos = player.getPosition(); String message = "Hello, World!\n" + "[name]=[" + player.getName().getFormattedText() + "]\n" + "[pos]=[" + pos.getX() + "," + pos.getY() + "," + pos.getZ() + "]"; ITextComponent text = new StringTextComponent(message); player.sendMessage(text); } }src/main/resources/pack.mcmeta
リソースパック情報記述用ファイル。このファイルが無いと 「failed to load a valid ResourcePackInfo」 などのエラーが発生してしまう。
ここでは最低限の内容のみ記述する。{ "pack": { "description": "Hello World mod resources", "pack_format": 5 } }src/main/resources/META-INF/mods.toml
Mod 情報記述用ファイル。
ここでは最低限の内容のみ記述する。modLoader="javafml" loaderVersion="[31,)" [[mods]] modId="helloworldmod" version="1.2.3" displayName="Hello World Mod" description=''' This is the ... Hello World mod. '''build.gradle
Gradle 用ビルド設定ファイル。
ここでは最低限の内容のみ記述する。buildscript { repositories { maven { url = 'https://files.minecraftforge.net/maven' } jcenter() mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true } } apply plugin: 'net.minecraftforge.gradle' version = '1.2.3' group = 'com.example.helloworld' archivesBaseName = 'helloworldmod' sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' minecraft { mappings channel: 'snapshot', version: '20190719-1.14.3' runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { helloworldmod { source sourceSets.main } } } } } dependencies { minecraft 'net.minecraftforge:forge:1.15.2-31.1.0' }配布用 jar ファイルを生成
IntelliJ IDEA 右上にある Gradle Tool Window から Tasks > build > build を実行するか、または Terminal などから ./gradlew build を実行する。
$ ./gradlew build配布用の jar ファイルが build/libs ディレクトリに出力される。
$ ls build/libs/ helloworldmod-1.2.3.jarMinecraft Forge で実行
正規版 Minecraft Java Edition の Minecraft Launcher を起動して Minecraft Forge 1.15.2-31.1.0 用の構成を設定する。
作成した jar ファイルを設定した構成のゲームディレクトリの mods ディレクトリに設置して、Minecraft Forge 1.15.2-31.1.0 を起動。
Hello World Mod が読み込まれているのを確認できる。
ワールドに入るとチャット欄に Hello World が表示される。
参考資料
- Forge 31.1 Minecraft 1.15.2 - Releases - Minecraft Forge Forums
- Forge Documentation
- GitHub - MinecraftForge/MinecraftForge: Modifications to the Minecraft base files to assist in compatibility between mods.
- ForgeJavaDocs
- Minecraft 1.14.4 Forge Modの作成 その2 【基本的なファイルの配置】 - Qiita
- Minecraft Forge Eventシステム概要 - Minecraft Modding Wiki
- Minecraft Forge API - Minecraft Modding Wiki
- 投稿日:2020-02-16T22:10:05+09:00
【CQEngine】Java7でもStreamとか.NetのLINQみたいにコレクションを扱いたい
背景
- レガシー環境では、ミドルウェアの関係でJava8が使えずStreamが利用できない
- コレクションを整形するときはfor文でぶん回している。
そこでJava7でも、StreamやLinQのようにスマートにコレクション操作できるものを探しました。
(ほかにfor文のぶん回し回避方法をご存じでしたら教えてください)CQEngineについて
Awesome Java : 素晴しい Java フレームワーク・ライブラリ・ソフトウェアの数々
上記記事で紹介されていました。CQEngine
公式リポジトリ Github : CQengin
- CQEngineはモデルに対し、Indexを設定することで超高速なCollection操作を提供するライブラリのようです
- 今回はStreamの代わりとしてJava7で使えるかを検証していきます
- 主題とずれるためIndexについては検証しません
License
「CQEngine」のライセンスは「Apache License 2.0」です。
CQEngineでのコレクション操作の記述方法
Queryの利用
- メリット
- タイプセーフに書ける
- for文でぶん回すより可読性が高い
- Indexを設定することによりJava8のStreamより早くなるみたいです ※ [question] Performance difference in Query vs standard collection lambda
- デメリット
- POJOそのままには使えない
- Attributeの設定方法の学習コストがかかりそう
- CQEngine用の記述方法が必要
// already defined Attribute in Car Class // search brand-new AAACar uery<Car> query1 = and( endsWith(Car.NAME, "AAACar"), equal(Car.DISCREPRION, "brandNew") ); ResultSet<car> resultSet = cars.retrieve(query1));CQN dialectsの利用
- メリット
- POJOに適用できる
- for文でぶん回すより可読性が高い・・・?
- デメリット
- タイプセーフでない
- CQEngine用の記述方法が必要
import static com.googlecode.cqengine.codegen.AttributeBytecodeGenerator.*; // generate Attribute CQNParser<Car> parser = CQNParser.forPojoWithAttributes(Car.class, createAttributes(Car.class)); // search brand-new AAACar ResultSet<Car> results = parser.retrieve(cars, "and(" + "equal(\"name\",\"AAACar\")," + "equal(\"discription\", \"brandNew\")" + " )");SQL dialectsの利用
- メリット
- POJOに適用できる
- SQLがわかる人であれば使える(ちょっと異なるルールもありそう)
- デメリット
- タイプセーフでない
// generate Attribute SQLParser<Car> parser = SQLParser.forPojoWithAttributes(Car.class, createAttributes(Car.class)); // search brand-new AAACar ResultSet<Car> results = parser.retrieve(cars, "SELECT * FROM cars " + "WHERE (" + " name = 'AAACar' " + " AND discription = 'brandNew')" ); for (Car car : results ) { System.out.println(car.toString()); }検証
Maven
現時点での最新版を入れています
Java7で使える「2.12.4」を入れます<dependency> <groupId>com.googlecode.cqengine</groupId> <artifactId>cqengine</artifactId> <version>2.12.4</version> </dependency>リリースノートを見ると、Ver3からJava7以下は対象外となったみたいです。
CQEngine Release Notes比較用のデータの準備
コレクション用のモデルの用意
Carを作りました。※ @ Data はlombokを使っているため記述しています
@Data public class Car { private int carId; private String name; private String discription; private List<String> features; }比較
Java7のfor文ぶん回し
// create car collection Set<Car> cars = new HashSet<>(); cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); cars.add( Car.builder().carId(1).name("BBBCar").discription("used").features( Arrays.asList("spare tyre", "radio")).build() ); cars.add( Car.builder().carId(2).name("CCCCar").discription("used").features( Arrays.asList("radio", "sunroof")).build() ); cars.add( Car.builder().carId(3).name("DDDCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); cars.add( Car.builder().carId(4).name("AAACar").discription("used").features( Arrays.asList("radio", "sunroof")).build() ); cars.add( Car.builder().carId(5).name("BBBCar").discription("brandNew").features( Arrays.asList("spare tyre", "radio")).build() ); cars.add( Car.builder().carId(6).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); cars.add( Car.builder().carId(7).name("DDDCar").discription("used").features( Arrays.asList("radio", "sunroof")).build() ); cars.add( Car.builder().carId(8).name("AAACar").discription("used").features( Arrays.asList("spare tyre", "sunroof")).build() ); cars.add( Car.builder().carId(9).name("BBBCar").discription("used").features( Arrays.asList("spare tyre", "radio")).build() ); cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); // search brand-new AAACar Set<Car> results = new HashSet<>(); for (Car car : cars) { if ( Objects.equals(car.getName(), "AAACar") && Objects.equals(car.getDiscription(), "brandNew") ) { results.add(car); } } for (Car car : results ) { System.out.println(car.toString()); // => Car(carId=0, name=AAACar, discription=brandNew, features=[spare tyre, sunroof]) }CQN(CQEngine Native)を用いる
Streamの代替品として利用することを目的としているため、POJOにAttributeを加えない方針で検証します。
Attributeを用いないCQN記法で試してみます。
Generate attributes from private class fields
POJOのprivateなフィールドを取得することは難しいそうなので、getterを用いる設定をcreateAttributesに設定しています。// generate Attribute CQNParser<Car> parser = CQNParser.forPojoWithAttributes(Car.class, createAttributes(Car.class, MemberFilters.GETTER_METHODS_ONLY)); // create car collection IndexedCollection<Car> cars = new ConcurrentIndexedCollection<>(); cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); //(省略) cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); // search brand-new AAACar ResultSet<Car> results = parser.retrieve(cars, "and(" + "equal(\"getName\",\"AAACar\")," + "equal(\"getDiscription\", \"brandNew\")" + " )"); for (Car car : results ) { System.out.println(car.toString()); // => Car(carId=0, name=AAACar, discription=brandNew, features=[spare tyre, sunroof]) }Java8のStream
// create car collection Set<Car> cars = new HashSet<>(); cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); //(省略) cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() ); // search brand-new AAACar Set<Car> results = cars.stream() .filter(car -> Objects.equals(car.getName(), "AAACar") && Objects.equals(car.getDiscription(), "brandNew") ) .collect(Collectors.toSet()); for (Car car : results ) { System.out.println(car.toString()); }CQEngineをJava7以下で使う方法
CQEngineのVer3以上をはJava7対応していないので、下記エラーが出ます。
Unsupported major.minor version 52.0結論
- タイプセーフにこだわらないのであれば、可読性は向上できそうです
- タイプセーフに使うためにはひと手間付け加える必要あり(POJOにAttributeを設定する)
- 最新版はJava7では使えない
- Java7でStreamの代用として利用するという点ではそこまで魅力を感じなかったので(もともとそういうライブラリでない)
大量データを高速に処理したいときの候補として覚えておきますもっと素直にStreamを Java7- で使う
Lightweight-Stream-API - Java6・7でもStream APIを使いたい
こちらはそのままStreamのように利用できるライブラリみたいです
Java8に移行するときは、移行前はこのライブラリで移行後のコードはJava8のStreamといった
カオスな状況にならないように気を付けないといけないとおもったので
今回CQEngineがJava8以降についても標準ライブラリを超えられるかという観点で調査しようと思いました。
なので、今後は大量データ処理でのCQEngineの性能を評価していきたいと思います大量データでの利用
(別記事で書きます)
データを用意するのは大変なので、多めのデータが取れるAPIを探します。
個人でも使える!おすすめAPI一覧
- 投稿日:2020-02-16T20:22:27+09:00
VSCode+GradleでJavaFXのHelloWorldを動かすまで
はじめに
VSCode+GradleでJavaFXを「とりあえず」動かすにはどうしたらいいのかメモ的に書きます。
随所に先人の知恵をコピペしてできましたものです。先人の皆さま、いつもありがとうございます。0. 環境
利用したツールと実行環境は以下のとおりです。
- Linux Mint 19.3
- OpenJDK 11
- OpenJFX 11 (11.0.6)
- VSCode(code) 1.42.1
- Gradle 6.1.1
また、タイトルの部分にフォーカスするため、個々のツールのインストールについては割愛します。
1. Gradleでプロジェクトを作成する
プロジェクトディレクトリを作成し、gradle initを実行します(gradleコマンドにパスを通している前提です)。以下のように選択肢に答えていくと出来あがります。
ximia@thinkpad:~/dev/sandbox02$ gradle init Select type of project to generate: 1: basic 2: application 3: library 4: Gradle plugin Enter selection (default: basic) [1..4] 2 Select implementation language: 1: C++ 2: Groovy 3: Java 4: Kotlin 5: Swift Enter selection (default: Java) [1..5] 3 Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] 1 Select test framework: 1: JUnit 4 VSCode 2: TestNG 3: Spock 4: JUnit Jupiter Enter selection (default: JUnit 4) [1..4] 1 Project name (default: sandbox02): Source package (default: sandbox02): me.osa2.java.sandbox02 > Task :init Get more help with your project: https://docs.gradle.org/6.1.1/userguide/tutorial_java_projects.html BUILD SUCCESSFUL in 42s 2 actionable tasks: 2 executed ximia@thinkpad:~/dev/sandbox02$2.VSCodeでtasks.jsonを追加する
上で作ったsandbox02ディレクトリをVSCodeのワークスペースにフォルダ追加してから、デフォルトのビルドを実行とします。
が、何を実行したらいいのか分からないVSCodeがConfigを作れと行ってきます(下の図)。画面中央上に表示されている「Configure Build Task...」をクリックします(VSCodeを日本語化とかしている人は、適宜脳内通訳してください)。選択肢ではその他を選びます。するとHelloと表示するだけのtasks.jsonがプロジェクトの.vscodeフォルダ下に出来あがります。そこに以下をまるっと全体上書きでコピペします。
{ "version": "1.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "./gradlew build" }, { "label": "run", "type": "shell", "command": "./gradlew run", "group": { "kind": "build", "isDefault": true } }, { "label": "clean", "type": "shell", "command": "./gradlew clean" }, { "label": "check", "type": "shell", "command": "./gradlew check" }, { "label": "create-jar", "type": "shell", "command": "./gradlew jar" } ] }保存後に、VSCodeのメニューから Terminal > Run Buld Task... を選択すると下のシェルの画面でごそごそとビルドが走り、Gradleがinit時に用意したコンソールアプリでの"Hello World"が表示されます。
tasks.jsonをみると、gradle runがbuildタスクのデフォルトとなっていることがわかります。3. JavaFXのコードに差し替える
非常に雑ですが、VSCode内でsrc/main/java/(パッケージパス)/App.javaを以下のコードでまるっと上書きし、ファイル名をHelloWorld.javaに変更します。また、src/test以下にあるテスト用のスケルトンもエラーとなるので(ここではテストコードは書かないということで)、削除します。
package your.package.path; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class HelloWorld extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } }なお、このコードは天下のOracleさまの以下のページからまるっと拝借してまいりました。
https://docs.oracle.com/javafx/2/get_started/hello_world.htm4. VSCode, Gradleそれぞれにクラスパスを通す
まず、build.gradleを以下のようにまるっと置き換え、保存します。mainClassNameは皆さまそれぞれのご都合に合わせて書き換えください。ここまででビルド(gradle run)をすると、JavaFXのアプリが起動されます。アプリのイメージは末尾にあります。
/* * This file was generated by the Gradle 'init' task. * * This generated file contains a sample Java project to get you started. * For more details take a look at the Java Quickstart chapter in the Gradle * User Manual available at https://docs.gradle.org/6.1.1/userguide/tutorial_java_projects.html */ plugins { id 'java' id 'application' id 'eclipse' // for auto-completion enabled .classpath. id 'org.openjfx.javafxplugin' version '0.0.8' } repositories { jcenter() } javafx { version = "11" modules = [ 'javafx.controls'] } dependencies { // This dependency is used by the application. implementation 'com.google.guava:guava:28.1-jre' // Use JUnit test framework testImplementation 'junit:junit:4.12' // Making Runnable Jar implementation "com.github.jengelman.gradle.plugins:shadow:5.1.0" } mainClassName = 'me.osa2.java.sandbox02.HelloWorld' tasks.withType(JavaCompile) { options.encoding = "UTF-8" } jar { manifest { attributes ('Main-Class': mainClassName, "Implementation-Title": "Gradle", "Implementation-Version": 1) } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }次に.vscodeフォルダ(先ほどtasks.jsonを作ったフォルダ)にlaunch.jsonをファイル作成し、以下を中身として、まるっと貼り付けます。メインクラス名、パッケージ名、openjfxのlibのパスは皆さまそれぞれのご都合に合わせて書き換えください。これでVSCodeを起動し直すとソース上で認識不能だった識別子の赤波アンダーラインが消えるはずです。
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "java", "name": "Debug (Launch) - Current File", "request": "launch", "mainClass": "${file}" }, { "type": "java", "name": "Debug (Launch)-HelloWorld<sandbox02>", "request": "launch", "mainClass": "me.osa2.java.sandbox02.HelloWOrld", "projectName": "hello", "vmArgs": "--module-path /home/ximia/libs/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml" } ] }5. おわりに
Qiitaの他の記事の寄せ集め的で、しかも「まるっとコピペ」ばかりでスミマセン。
動いてから諸々考えたい人にはよろしいかと。ご参考に慣れば幸いです!== END ==
- 投稿日:2020-02-16T16:00:45+09:00
Minecraft Forge の API リファレンスを javadoc コマンドで生成する
今回の実行環境
macOS Catalina + Java 8
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.3 BuildVersion: 19D76 $ java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08) OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)javadoc コマンドで API リファレンスを生成
Minecraft Forge のソースコードをダウロードして展開する。
今回はバージョン 1.15 系をダウンロードする。$ wget https://github.com/MinecraftForge/MinecraftForge/archive/1.15.x.zip $ unzip 1.15.x.zipjavadoc コマンドで API リファレンスの HTML ページを生成する。
$ javadoc -d docs -sourcepath MinecraftForge-1.15.x/src/main/java -subpackages net.minecraftforge-d オプションで指定したディレクトリに HTML ファイル等が生成されているのが確認できる。
$ find docs | head docs docs/constant-values.html docs/overview-tree.html docs/net docs/net/minecraftforge docs/net/minecraftforge/registries docs/net/minecraftforge/registries/IRegistryDelegate.html docs/net/minecraftforge/registries/IForgeRegistry.CreateCallback.html docs/net/minecraftforge/registries/ForgeRegistry.Snapshot.html docs/net/minecraftforge/registries/ObjectHolderRef.html参考資料
- 投稿日:2020-02-16T01:05:18+09:00
「javadoc エラー - input length = 1を読み込めません」の解決法
eclipseからjavadocを出力しようとしたとき、「javadoc エラー - input length = 1を読み込めません」のエラーが発生する場合があるが、検索しても解決方法が出てこなかったため、私が解決した方法をここに記載しておく。
解決方法
私の場合、javadocを出力する際にjavadocコマンドを指定するが、そのjavadocコマンドのJavaバージョンと、プロジェクトのJavaバージョンが違っていた。
これを、プロジェクトのJavaバージョンのjavadocコマンドを指定するように修正するとエラーが発生しなくなった。あとがき
こんなことは当たり前過ぎるかもしれないが、古いJavaバージョンのJavaプロジェクトの修正等を最新のeclipseでやろうとした場合はjavadocコマンドがデフォルトで最新のJDKで設定されているため、盲点だった。