java.util.zip.ZipException:使用SentenceModel设置的代码长度无效

时间:2017-04-14 21:12:13

标签: java opennlp

我使用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)

由于

3 个答案:

答案 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