【问题标题】:Groovy unable to load classGroovy 无法加载类
【发布时间】:2016-10-01 23:43:57
【问题描述】:

我正在尝试对 PDFBox 和 Groovy 进行一些处理。我正在尝试使用 PDType1Font 类的 getStringWidth() 方法计算字符串的宽度。

我的问题是每次编译和运行代码时,我都会收到一条错误消息:

Error:Groovyc: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Unable to load class org.apache.pdfbox.pdmodel.font.PDType1Font due to missing dependency org/apache/fontbox/type1/DamagedFontException
    at org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1091)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1069)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
    at org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:62)
    at org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovyc(DependentGroovycRunner.java:115)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jetbrains.groovy.compiler.rt.GroovycRunner.intMain2(GroovycRunner.java:135)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovycInThisProcess(InProcessGroovyc.java:156)
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.access$000(InProcessGroovyc.java:51)
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc$1.call(InProcessGroovyc.java:85)
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc$1.call(InProcessGroovyc.java:82)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

代码如下:

import org.apache.pdfbox.pdmodel.font.PDType1Font

float getStringWidth(String text) {
        PDType1Font font = new PDType1Font(PDType1Font.HELVETICA)
        float width = font.getStringWidth(text) / 1000 * 8;

        return width
    }

为了清楚起见,我删除了代码中所有不相关的部分。

有什么问题?

更新:我搜索了一下如何在 IntelliJ 中将外部 jar 添加到我的类路径中,我发现我需要转到项目结构 -> 模块 -----> 依赖项,然后我需要配置我的库作为依赖项。

我试着这样做:

但我仍然收到上述错误消息。

【问题讨论】:

  • 代码将需要类路径上的 PDFBox jar(及其依赖项,例如 fontbox)。这可以使用 Gradle 完成,但对于一个简单/简单的示例,请查看此项目中的 'setvars.sh' - github.com/peidevs/OpenDataBookClub/tree/master/tools/…
  • 您能详细说明一下吗?我不完全理解这个 setvars.sh 文件是什么以及它是如何执行的,也不是什么时候执行的。我还用图片更新了这篇文章。
  • 你的图片显示你有不同的版本。显然,你也需要拥有 fontbox 2.0.3。

标签: groovy dependencies classpath pdfbox


【解决方案1】:

根据 OP 的snapshot of the project structure,他使用了这些依赖项:

这不起作用,pdfbox 和 fontbox 的版本必须匹配(如Tilman 所述)。特别是版本 2 引入了大修 API。因此,很难期望 PDFBox 2.0.x 版与 FONTBox 1.8.y 版一起正常工作。

【讨论】:

    【解决方案2】:

    Java 约定意味着您必须在类中声明代码。

    这意味着每个方法都应该在一个类中定义,并具有与其包装的方法相关的名称。

    例如,您可以使用以下代码结构:

    import org.apache.pdfbox.pdmodel.font.PDType1Font
    
    class StringUtils {
    
        float getStringWidth(String text) {
            PDType1Font font = new PDType1Font(PDType1Font.HELVETICA)
            float width = font.getStringWidth(text) / 1000 * 8;
    
            return width
        }
    }
    

    在上面的示例中,StringUtils 是 JVM 正在寻找的类名。

    通过使用该约定,代码被编译为字节码并创建相关的 jar,这可能应该解决您遇到的错误。

    注意:确保您的 PATH ENV 变量包含代码工作区目录以及所有相关的第三方目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多