我正在尝试将GATE应用程序作为独立的JAR文件进行分发。我在项目的类路径中将GATE插件作为资源,但是setGateHome()
需要一个File对象,我无法从JAR中打包的资源中获取该对象。
我认为Java IO可以充分抽象,API可以处理这种情况,但事实证明File对象只引用磁盘上的物理文件。
有没有其他方法可以使用GATE API执行此操作?或者一些选项强制JAR在运行之前将自己解压缩到临时文件夹?
example in the docs用于servlet,但在这种情况下,可以从servlet获取文件对象(我认为因为WAR文件是由servlet容器解压缩的。)
答案 0 :(得分:1)
根据我对GATE的经验,我可以建议使用本地驱动器所需的资源解压缩jar。通常我将所有资源(ANNIE,Tokenizer,JAPE,Gazetteers)保存在一个文件夹中,并使用相对路径来访问这些资源。 作为附加选项,您可以尝试使用:http://jenkins.gate.ac.uk/job/GATE-Nightly/javadoc/gate/Gate.html#runInSandbox(boolean)选项。
答案 1 :(得分:0)
根据ashingel的建议,如果从JAR文件运行,我决定将门资源解压缩到临时文件夹中。
有关如何解压缩文件夹的详细信息,请参阅我的答案:https://stackoverflow.com/a/16659655/281469
以下是我在初始化时所做的示例用法(注意:Apache Commons IO依赖):
//My GATE resources are in the "/gate" folder of the JAR
URI url = getClass().getResource("/gate").toURI();
File gateHome;
if (url.isOpaque()) {
logger.info("Unpacking GATE resources from JAR");
String tempDirectoryPath = FileUtils.getTempDirectoryPath();
String gateResource = "gate";
//Delete any existing temporary directory
FileUtils.deleteDirectory(new File(FilenameUtils.concat(tempDirectoryPath, gateResource)));
String gateHomePath = extractDirectoryFromClasspathJAR(getClass(), gateResource, tempDirectoryPath);
gateHome = new File(gateHomePath);
} else {
gateHome = new File(url);
}
Gate.setGateHome(gateHome);