動的言語のいくつかの利点と、通常のJavaコードの強力な型付けをどのように組み合わせることができますか?
Habréで最も興味深いのは、通常記事へのコメントです。 そのため、今回は、
「OSGIとジグソーを使用しないJavaSEでのモジュール化」へのコメントで、javaのリフレクションによる作業が
mvn-classloaderライブラリの多くの利点を
打ち消すという議論が始まりました。 Groovyでは、このライブラリーの操作は簡単で便利です。
def hawtIoConsole = MavenClassLoader.usingCentralRepo().forMavenCoordinates('io.hawt:hawtio-app:2.0.0').loadClass('io.hawt.app.App') Thread.currentThread().setContextClassLoader(hawtIoConsole.getClassLoader()) hawtIoConsole.main('--port','10090')
プロジェクトのソースコードが
githubにある java-as-script.jarを使用して修正してみましょう。
動的コンパイル
JSR 199標準はjavaコンパイラAPIであり、かなり以前から存在しています。 APIは、javaパッケージ
javax.tools。*に含まれています。 ただし、Javaコードをメモリからメモリにコンパイルして実行するには、きれいな
コードを作成してタンバリンに打ち込む必要があります。 コンパイラの実装はJREの一部として行われず、tools.jarはMavenリポジトリにありません。
毎回サイクルするのではなく、何か準備ができていて、同僚が
ジャニーノプロジェクトを提案した。 Janino自体にはjavaのサブセットの独自のコンパイラが含まれており、式の計算にのみ適しています。 JSR 199を使用するorg.codehaus.janino:commons-compiler-jdkがありますが、これはoracle / openjdk tools.jarのみに大きく依存しています。 このプロジェクトを完了したjava-as-scriptには、Eclipse javaコンパイラと、そのために変更されたcommons-compiler-jdkが含まれています。 自己完結型であり、JREでも
Java 8コードをコンパイルおよびロードできます。
動的依存関係の解決
Groovyには、Mavenリポジトリーから依存関係をスクリプトに追加できる便利な
Grapeメカニズムがあります。
javaコンパイラと
mvn-classloaderを
組み合わせると、ソースコードのコメントを使用してJavaプログラムに依存関係を追加できます。
実用的な例を挙げましょう。
RaspberryPiで
アラームコードを実行するには、
1つのjavaファイルで十分です。 コマンドラインから例を実行できます。
java -Dlogin=...YOUR_EMAIL...@mail.ru -Dpassword=******* -jar java-as-script-1.1.jar https://raw.githubusercontent.com/igor-suhorukov/alarm-system/master/src/main/java/com/github/igorsuhorukov/alarmsys/AlarmSystem.java
package com.github.igorsuhorukov.alarmsys;
コードのリフレクションを取り除くには、mvn-classloaderローダーからクラスキャストが行われるAPIをスクリプトの依存関係で指定し、スクリプトクラスをロードしたローダーを親ローダーとして指定する必要があります。
既存のJVMプログラムにスクリプトを埋め込むのは非常に簡単です。
org.github.suhorukov.java.as.script.ScriptRunner#runScript(String scriptText, String[] scriptArgs)
クラスローダーが必要な場合は、
org.github.suhorukov.java.as.script.JavaCompiler#compileScript(java.lang.String scriptText)
そして、プログラムのスクリプトからクラスを操作します。
pom.xmlおよびjavaソースを迅速にデバッグおよび生成するには、-DgenerateMavenProjectAndExit = trueパラメーターを使用してプログラムを実行できます
現在のディレクトリに、mavenのpomファイルと、ソースコードを含むすべての必要なディレクトリが作成されます。 これにより、通常のIDEでJavaコードを操作してデバッグするためのすべての機能を備えたスクリプトを開発できます。
java-as-script
は、数百のjava.net.URLプロトコルのいずれか
を使用してプログラムのソースコードをロードし、コメント//依存関係:mvn:/として指定されたJavaスクリプトの依存関係を解決し、これらの依存関係でソースコードをコンパイルし、クラスをロードし、開始しますその主な方法。 この場合、リモートデバッガーを使用して接続し、通常のJavaプログラムとしてスクリプトをデバッグできます。