我有一个maven项目,其资源打包在src / main / resources中。该依赖项使用weka库,特别是AddClassification.setOptions()
方法中的AddClassification class使用java.io.FILE
类来读取给定的模型文件。
也许重要的是要注意这个项目是其他maven项目的依赖项,最后它将被运行在apache-tomcat中的Web应用程序应用程序使用。
为了澄清,方法AddClassification.setOptions()
被称为:
AddClassification filter = new AddClassification();
filter.setInputFormat(labeled);
String[] options = new String[3];
options[0] = "-serialized";
options[1] = "models/trained.model";
options[2] = "-classification";
filter.setOptions(options);
所以,直到我的问题和需求:
AddClassification.setOptions()
; java.io.File
无法直接读取Jar文件中的文件(我查了一下); class.getResourceAsStream
可以很好地解决问题但是weka库需要一个String参数来使用java.io.File
。我该如何解决这个问题?我可以轻松地将所有资源复制到硬编码的系统目录,但这会使我的项目难以分发到其他系统。 我正在寻找解决问题的正确方法。
我希望自己足够清楚。
答案 0 :(得分:0)
查看代码我可以看到实现它的最简单方法是子类AddClassification
并覆盖受保护的getActualClassifier
方法以从getResourceAsStream
加载分类器。令人讨厌的是,您仍然必须确保将路径传递给setOptions
肯定存在的文件,否则它会抱怨,但您可以使用/dev/null
或{{1}之类的东西逃脱因为您不需要从文件中实际读取,所以它必须存在。
/bin/sh
答案 1 :(得分:-1)
您始终可以将资源复制到临时文件中:
Path file = Files.createTempFile(null, null);
try (InputStream stream =
MyOwnClass.class.getResourceAsStream("models/trained.model")) {
Files.copy(stream, file, StandardCopyOption.REPLACE_EXISTING);
}
options[1] = file.toString();
答案 2 :(得分:-2)
请试一试
AddClassification filter = new AddClassification();
filter.setInputFormat(labeled);
String[] options = new String[3];
options[0] = "-serialized";
options[1] = this.getClass().getResource("/models/trained.model").getFile();
options[2] = "-classification";
filter.setOptions(options);