Java」タグアーカイブ

GraalVM macOS awt

GraalVM の macOS 版って全然ダメだ。

awt を使おうとしたら、ビルドはできるけど JVM で弾かれる。
/opt/X11/lib/libfreetype.6.dylib
が無いって言われましても。。。。。

/opt すら無いよ、筆者の 2018 Air には。
てゆーか X11 だったのカヨ!

Java Client Roadmap Updateによせて (前編) – AOEの日記

JavaFX 以外は使うなになったのかな?と思ったけど違うんだな。
Java8 とはいえ、いつの mac で JVM を開発しているんだろう?
Java11 なら問題ないかどうかは知らない。

それと js で TimerTask を使おうと思ったけど。
継承が使えるとは思っていなかったけど、Nashorn と同じ表記もできない。
いくら探しても手段が見つからない、何を試しても動かない。
そういう使い方をするためのものではない、って感じ。
そういう使い方をするために入れたのに。。。。。

もう GraalVM はヤメ!
同梱の Node.js はありがたく使わせてもらいます。

Fedora 29 java and GraalVM java

Fedora 29 OpenJDK の java が 1.8 に差し変わっていた。

javac でコンパイルした class を java で実行できないっていう。
/usr/lib/jvm/java-11/bin/java
で実行すれば動きます。
何かのアプリの影響なのか仲の人のうっかりなのか?

実は mac に GraalVM rc14 を入れてみたのだけど。

1.8 なのね、shebang 実行できないジャン。
おまけに。

//#!/usr/bin/env js --jvm
// シバンがあると error (rc14)

const System  = Java.type('java.lang.System');
const BufferedReader = Java.type('java.io.BufferedReader');
const InputStreamReader = Java.type('java.io.InputStreamReader');
 
var console = System.console();
if (console == null) {
    let r = new BufferedReader(new InputStreamReader(System.in));
    let line = r.readLine();
    System.out.println(`${line} がパイプから渡されました`);
} else {
    let line = console.readLine('何か入力して Enter : ');
    System.out.println(`${line} が入力されました`);
}

js コマンドも shebang があるとエラーになる。
–no-shebang オプションがあるのにどういうことだってばよ。
なんか Java 関連がボロボロだな。

JavaScript 覚書ページの内容が古くなってきたので書き換え予定でありまして。
jjs を GraalVM js に書き換えするつもりだったけど、ヤル気なくした。

jshell

すまぬ、Mojave には Ruby が入っていたのをさっき気が付いた。
ruby と打っても何も起きなかったんで、インタラクティブシェルは irb だったよ。
Python3, Gjs 共に引数無しでインタラクティブシェルなのでうっかり勘違い。
jxa は -i オプションなんだよね、統一してくれると助かるけど無理だろうな。

インタラクティブシェルといえば Java もできるようになったっけ。
[Java9 新機能] jshell入門 – Qiita
Fedora に入っている OpenJDK 11 でも使えるのかな?

使えるようだ、これも javac は多分必要なんだろうけど。
冗談のつもりで public を付けたら通った、何の公開メソッドだよw
更に static まで付けたら怒られた、当然か。
print も console.log も使えない、println 書くのメンドイぞ。

ところで終了は普通のシェル同様に Ctrl+D でできる。
macOS では control+D は使えないのか?
いや、Qiita の mac 使いは control+C でシェルを終了している輩が多々…
ちなみに Ctrl+C は無視される、Python も同じだけどね。

しかし今の Java で var が使えてスクリプト言語みたく使えてこんなことまで。
GraaLVM って必要性をあまり感じなくもないような。

Fedora 29 OpenJDK

Fedora 29 では OpenJDK が 1.8 から 11 になった。
いきなり凄いバージョンアップだよなぁ、って違う!
IcedTea ベースの今までと違い Oracle のソースになったみたい。

Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 ? Publickey

なんか色々あるようだけど。
RHEL の先行開発版である Fedora には RHEL 用のそのままが使われると思う。
サポート切れや脆弱性については後ろに RedHat がいるので何も問題ない。

それはいいとして。
jjs は 29 でも実行できるけどアップグレードされていないので es6 は使えない。
GraalVM は dnf list でも出てこない、うーん。

とりあえず Java 11 はコンパイルなしで実行できるらしいので試してみよう。

JEP 330: Launch Single-File Source-Code Programs

なんとシバンが使えるようだ。
つまり Java 言語のまま普通のスクリプトとして使える、よし早速。

#!/usr/bin/java --source 11
// -*- Mode: Java -*-

public class Hoge {
    public static void main(String[] args) {
        System.out.printf("%s\n", "ほげ");
    }
}

動いたけど…

結論、インタプリタ実行しているのではない。
メモリ上にコンパイルしてソレを実行しているだけのようだ。
つまり javac が必要、Fedora デフォルトには入っていない。

sudo dnf install java-11-openjdk-devel

それと、シバンを使う時は拡張子を取っ払う必要がある。
Gedit で色分けできないのでモードラインを使いましょう。

*.java 拡張子をつけたまま usr/bin/java に渡すこともできる。
この時はシバンがあるとエラーになる、なんかもどかしい。

ようするに拡張子が無い場合は一行目を無視する、って感じの単純な実装みたい。
macOS ならそれでいいんだけどね。