Saya mencoba menggunakan paket NPM inline-css dalam proyek Java melalui J2V8 ke lembar gaya sebaris menjadi atribut gaya.

final NodeJS nodeJS = NodeJS.createNodeJS();
final V8Object inlineCss = nodeJS.require(new File(
    "path/to/node_modules/inline-css/index.js"
));
final V8 jsRuntime = nodeJS.getRuntime();

final Map<String, Object> inlineOptions = new HashMap<>();
inlineOptions.put("applyLinkTags", false);
inlineOptions.put("removeStyleTags", false);
inlineOptions.put("url", "http://example.com");

jsRuntime.add("inlineCss", inlineCss);
jsRuntime.add("inlineOptions", V8ObjectUtils.toV8Object(jsRuntime, inlineOptions));

try (FileInputStream inputStream = new FileInputStream(pageFile)) {
    byte[] data = new byte[(int) pageFile.length()];
    inputStream.read(data);

    String pageContent = new String(data, "UTF-8");

    JavaVoidCallback successCallback = new JavaVoidCallback() {
        @Override
        public void invoke(V8Object v8Object, V8Array v8Array) {
            //...
        }
    };

    JavaVoidCallback errorCallback = new JavaVoidCallback() {
        @Override
        public void invoke(V8Object v8Object, V8Array v8Array) {
            //...
        }
    };

    jsRuntime.add("pageContent", pageContent);
    jsRuntime.registerJavaMethod(successCallback, "onSuccess");
    jsRuntime.registerJavaMethod(errorCallback, "onError");

    jsRuntime.executeObjectScript("inlineCss(pageContent, inlineOptions).then(onSuccess).catch(onError)");
} catch (IOException | V8ScriptExecutionException | V8ScriptCompilationException e) {
    //...
}

Tetapi baik panggilan balik sukses maupun kesalahan tidak dipanggil dan tidak ada kesalahan yang dilemparkan. Saya tidak dapat menemukan dokumentasi yang tepat untuk J2V8 dan contoh yang diberikan tidak terlalu membantu di sini. Adakah yang pernah menggunakan J2V8 untuk bekerja dengan janji JavaScript? Atau apakah seseorang melihat kesalahan?

Juga, jika Anda mengetahui perpustakaan Java yang bagus untuk CSS sebaris, itu juga akan sangat membantu. Yang saya temui sejauh ini tidak benar-benar berfungsi dengan andal ketika Anda memiliki banyak kelas dan id pada elemen. CSSBox tampak seperti solusi yang menjanjikan tetapi tampaknya tidak menangani aturan awalan vendor dengan benar.

Alternatifnya adalah menggunakan skrip CLI tapi itu pilihan terakhir bagi saya, karena itu berarti saya juga perlu menggunakan NodeJS di sebelah aplikasi Java saya.

3
Mato 26 Juli 2016, 18:17

1 menjawab

Jawaban Terbaik

Anda harus memompa loop pesan Node.js:

while(nodeJS.isRunning()) {
  nodeJS.handleMessage();
}

Tambahkan ini ke bagian bawah kode Anda dan itu akan berfungsi. Selain itu, saya perhatikan bahwa Anda memiliki onSuccess(c), menurut saya c seharusnya pageContent.

2
irbull 26 Juli 2016, 23:39