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 から問題なく呼び出すことができ、別のクラスのコンストラクターを呼び出すことができないのはなぜですか??
解決方法、または原因の可能性があれば教えていただけるとありがたいです。
ありがとうございました!