2

Java コードを KNIME に統合する際に問題があります。Knime フォーラムの同様の投稿 ( http://tech.knime.org/forum/knime-general/using-external-jar-in-java-snippet-node-workflow-not-able-to-initialize-class-of )私もそこに質問を投稿しましたが、今のところ回答が得られていないので、ここで運試しをしています.

JavaSnippet を使用してコードを KNIME ワークフローに統合しようとしています。コードを jar にエクスポートし、KNIME jre/lib/endorsed フォルダーに配置しました。コードは CDK 1.4.19 を参照しており、対応する jar ファイルも同じディレクトリに配置しました。KNIME に CDK ノード拡張機能がインストールされておらず、それらを使用することも私の場合のオプションではありません。

コードは次のように始まります。

IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();

SmilesParser sp= new SmilesParser(builder);

JavaSnippet を実行しようとすると、次の例外メッセージが表示されます。

Evaluation of java snippet failed for row "Row0". Exception message: Could not initialize class org.openscience.cdk.smiles.SmilesParser

試してみると

IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();

それは機能し、例外メッセージは表示されません。確認しましたが、ビルダーは null ではありません。しかし、SmilesParser を初期化しようとすると失敗します。このクラスはパブリックです。デフォルトのコンストラクターはなく、IChemObjectBuilder をパラメーターとして受け取るパブリック コンストラクターが 1 つあります。

クラスローダーを使用しようとしました:

URL[] classLoaderUrls = new URL[]{new URL("file:///path on my computer/knime_2.9.4/jre/lib/endorsed/cdk-1.4.19.jar")};

URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);

Class<?> parserClass = urlClassLoader.loadClass("org.openscience.cdk.smiles.SmilesParser");

Class[] classParameters = new Class[] {IChemObjectBuilder.class};

Constructor<?> constructor = parserClass.getConstructor(classParameters); //until this line there are no problems

Object parser = constructor.newInstance(builder);   //fails here with the same exception message: Could not initialize class org.openscience.cdk.smiles.SmilesParser

Eclipse でコードを実行できるので、これは CDK エラーではないと確信しています。

あるクラスのコンストラクターを KNIME から問題なく呼び出すことができ、別のクラスのコンストラクターを呼び出すことができないのはなぜですか??

解決方法、または原因の可能性があれば教えていただけるとありがたいです。

ありがとうございました!

4

1 に答える 1