我使用OpenNLP进行句法分析。我写了这些行来加载 句子探测器模型:
InputStream is = getClass().getClassLoader().getResourceAsStream("models/en-sent.bin") ;
SentenceModel sModel = new SentenceModel(is);
以上行引发异常:java.util.zip.ZipException
:代码无效
长度设定。
"models/en-sent.bin"
位于"src/main/resources/models/en-
token.bin"
。
当我尝试使用以下方式打印文件路径时:
System.out.println(getClass().getClassLoader().getResource("models/en-sent.bin"));
路径显示为:"file:/C:/Users/aaa/workspace/qa/target/classes/models/en-sent.bin"
。
如果我使用以下方式加载模型:
InputStream is = new FileInputStream("src/main/resources/models/en-sent.bin") ;
SentenceModel sModel = new SentenceModel(is);
它工作正常,但是当我将文件构建到可运行的jar中时,此方法将无法工作。抛出此异常的任何帮助?
完整的堆栈异常在这里:
java.util.zip.ZipException: invalid code lengths set
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.ZipInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.util.Properties$LineReader.readLine(Unknown Source)
at java.util.Properties.load0(Unknown Source)
at java.util.Properties.load(Unknown Source)
at opennlp.tools.util.model.PropertiesSerializer.create(PropertiesSerializer.java:31)
at opennlp.tools.util.model.PropertiesSerializer.create(PropertiesSerializer.java:27)
at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:224)
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:173)
at opennlp.tools.sentdetect.SentenceModel.<init>(SentenceModel.java:91)
at com.elsevier.sherpath.syntactic_analysis.QuestionNLPAnalysis.<init>(QuestionNLPAnalysis.java:88)
at com.elsevier.sherpath.main.QuestionProcessing.syntacticAnalysis(QuestionProcessing.java:255)
at com.elsevier.sherpath.main.BatchProcess.main(BatchProcess.java:23)
由于
答案 0 :(得分:4)
您可以设置resource filtering
false并包含该bin文件,以便它不会受mvn install
影响。
<resource>
<directory>your resources directory</directory>
<filtering>false</filtering>
<includes>
<include>your-bin.bin</include>
</includes>
</resource>
异常的原因是maven正在尝试使用pom.xml
属性重新创建bin文件,因此,目标目录中的bin
文件与您的文件中的resource filtering
文件不同资源文件夹。因此,为bin
文件设置export default hoc(Component)
false。
答案 1 :(得分:1)
它工作正常,但是在构建文件时此方法不起作用 进入一个可运行的罐子里。抛出此异常的任何帮助?
InputStream is = new FileInputStream("src/main/resources/models/en-sent.bin") ;
使用系统相关的文件名
当您不在JAR中时,它将您项目的文件夹用作基本路径
当您在JAR中时,它将JAR本身用作基本路径
所以它无法运作。
您有两种方法可以解决您的问题:
通过指定类路径中的资源来使用类路径资源加载。例如InputStream is = YourClass.class.getResourceAsStream("/models/en-sent.bin");
在你的尝试中,我认为你已经忘记了路径开头的"/"
如果没有"/"
,则使用相对于调用方法的包的路径。
或者您将资源移到JAR之外,然后使用绝对路径访问它。例如:InputStream is = new FileInputStream("file:///D:/models/en-sent.bin");
。
答案 2 :(得分:0)
我们还可以使用此插件:
stack