20200216のJavaに関する記事は5件です。

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 からダウンロードする。

minecraft-forge-01.png

ダウンロードした 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.properties       

README.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 にて展開したフォルダを指定してプロジェクトを作成する。

minecraft-forge-02.png

以下のようなメッセージが出力された場合は適切な 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 が起動する。

minecraft-forge-03.png

「Mods」 をクリックすると Mdk に同梱されている Example Mod が読み込まれていることがわかる。

minecraft-forge-04.png

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.jar

Minecraft Forge で実行

正規版 Minecraft Java Edition の Minecraft Launcher を起動して Minecraft Forge 1.15.2-31.1.0 用の構成を設定する。

minecraft-forge-05.png

作成した jar ファイルを設定した構成のゲームディレクトリの mods ディレクトリに設置して、Minecraft Forge 1.15.2-31.1.0 を起動。

minecraft-forge-08.png

Hello World Mod が読み込まれているのを確認できる。

minecraft-forge-06.png

ワールドに入るとチャット欄に Hello World が表示される。

minecraft-forge-07.png

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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の利用

  • メリット
  • デメリット
    • 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一覧

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を日本語化とかしている人は、適宜脳内通訳してください)。

Screenshot at 2020-02-16 18-51-30.png

選択肢ではその他を選びます。すると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.htm

4. 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の他の記事の寄せ集め的で、しかも「まるっとコピペ」ばかりでスミマセン。
app.png
動いてから諸々考えたい人にはよろしいかと。ご参考に慣れば幸いです!:grinning:

== END ==

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.zip

javadoc コマンドで 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

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「javadoc エラー - input length = 1を読み込めません」の解決法

eclipseからjavadocを出力しようとしたとき、「javadoc エラー - input length = 1を読み込めません」のエラーが発生する場合があるが、検索しても解決方法が出てこなかったため、私が解決した方法をここに記載しておく。

解決方法

私の場合、javadocを出力する際にjavadocコマンドを指定するが、そのjavadocコマンドのJavaバージョンと、プロジェクトのJavaバージョンが違っていた。
これを、プロジェクトのJavaバージョンのjavadocコマンドを指定するように修正するとエラーが発生しなくなった。

あとがき

こんなことは当たり前過ぎるかもしれないが、古いJavaバージョンのJavaプロジェクトの修正等を最新のeclipseでやろうとした場合はjavadocコマンドがデフォルトで最新のJDKで設定されているため、盲点だった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む