java - 在 KNIME 中使用外部 java 库。为什么一个类的初始化失败而另一个类的初始化成功?

标签 java constructor knime

我在将 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();

它有效,我没有收到任何异常消息。我已经检查过,构建器不是空的。但是,当我尝试初始化 SmilesParser 时,它失败了。这个类是公开的。它没有默认构造函数,只有一个以 IChemObjectBuilder 作为参数的公共(public)构造函数。

我尝试过使用类加载器:

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

我确定这不是 CDK 错误,因为我可以在 Eclipse 中执行代码。

为什么可以从 KNIME 毫无问题地调用一个类的构造函数而另一个类的构造函数却不能?

如果您能提出解决方案或出现这种情况的可能原因,我将不胜感激。

谢谢!

最佳答案

好的,终于自己解决了这个问题。清理项目元数据,清理认可的库目录,将 KNIME 工作区切换到另一个目录,将所有 jar 放入一个文件夹并将它们添加为外部库。现在可以了:)

关于java - 在 KNIME 中使用外部 java 库。为什么一个类的初始化失败而另一个类的初始化成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170569/

相关文章:

java - 关于缺少 javax/mail/mail/1.4/activation.jar 的 Maven 编译错误。怎么修?

java - Mac 上的 Lotus Notes jvm\lib\ext 目录

c++ - 使用映射第二个参数的类构造函数初始化

java - 使用 Knime 定义 Oozie 工作流程

rows - 为行创建顺序 ID

java - Api Java弹性搜寻|通过传递列表并返回所有匹配项进行搜索

java - Spring Boot 无法解析 View

java - 我将如何构造一个非常简单的 java 数学表达式以与 KNIME 一起使用

Java构造函数并在运行时修改对象属性

c++ - 关于 C++ 中默认构造函数的奇怪编译器行为