Groovy无法加载类

时间:2016-10-01 23:43:58

标签: groovy dependencies classpath pdfbox

我试图用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,我发现我需要转到Project Structure - >模块----->依赖关系,然后我需要将我的库配置为依赖关系。

我试着这样做:

img

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

2 个答案:

答案 0 :(得分:1)

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

dependencies from snapshot

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

答案 1 :(得分:-1)

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变量包含代码工作区目录以及所有相关的第三方目录。