java.lang.NoClassDefFoundError: com/itextpdf/kernel/pdf/PdfWriter itext and gradle
我正在使用Gradle设置一个使用IText7生成PDF文件的测试项目。
如果我在NetBeans IDE中运行我的主类,一切都会正常工作;创建一个"results"文件夹,在其中我可以找到生成的PDF。
但是如果我清理并构建这个项目,进入ProjtTyBase/Buff/LIBS,并尝试执行Java-JavaMyPDFProjut.jar文件,我得到这个错误=java. Lang.NoCuffDeFuffNoDror:COM/ITTEXPDF/NoR/PDF/PDFIGFER。
这是我的主班(mypdfman.class)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.mypackage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import java.io.File; import java.io.IOException; public class MyPdfMain { public static final String DEST ="results/pdf/hello_word.pdf"; /** * @param args the command line arguments * @throws java.io.IOException */ public static void main(String[] args) throws IOException { File file = new File(DEST); file.getParentFile().mkdirs(); //Initialize PDF writer PdfWriter writer = new PdfWriter(DEST); //Initialize PDF document PdfDocument pdf = new PdfDocument(writer); // Initialize document Document document = new Document(pdf); //Add paragraph to the document document.add(new Paragraph("Hello World!")); //Close document document.close(); } } |
这就是build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | apply plugin: 'java' sourceCompatibility = '1.8' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' if (!hasProperty('mainClass')) { ext.mainClass = 'com.mypackage.MyPdfMain' } repositories { mavenCentral() } dependencies { compile group: 'com.itextpdf', name: 'kernel', version: '7.0.0' compile group: 'com.itextpdf', name: 'io', version: '7.0.0' compile group: 'com.itextpdf', name: 'layout', version: '7.0.0' compile group: 'com.itextpdf', name: 'forms', version: '7.0.0' compile group: 'com.itextpdf', name: 'pdfa', version: '7.0.0' compile group: 'com.itextpdf', name: 'pdftest', version: '7.0.0' testCompile group: 'junit', name: 'junit', version: '4.10' } task copyToLib( type: Copy ) { into"$buildDir/libs/lib" from configurations.runtime } jar{ dependsOn copyToLib manifest { attributes 'Main-Class': 'com.mypackage.MyPdfMain' // attributes 'Class-Path': configurations.compile.collect { it.getName() }.join(' ') } } |
如您所见,我创建了一个任务,将所有依赖jar复制到builds/libs/lib中。
任务copytolib(类型:copy){进入"$buildDir/libs/lib"从configurations.runtime}
并设置jar {依赖copytolib}
但是错误仍然是一样的。
我认为这应该是一个类路径错误,但我不知道如何在Gradle中以及在何处设置类路径。如何从终端运行我的项目?
谢谢你的帮助。使用应用程序插件是一个很好的解决方案!此外,我还找到了另一种方法来解决改变我的身材。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | apply plugin: 'java' sourceCompatibility = '1.8' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' if (!hasProperty('mainClass')) { ext.mainClass = 'com.mypackage.MyPdfMain' } repositories { mavenCentral() } dependencies { compile group: 'com.itextpdf', name: 'kernel', version: '7.0.0' compile group: 'com.itextpdf', name: 'io', version: '7.0.0' compile group: 'com.itextpdf', name: 'layout', version: '7.0.0' compile group: 'com.itextpdf', name: 'forms', version: '7.0.0' compile group: 'com.itextpdf', name: 'pdfa', version: '7.0.0' compile group: 'com.itextpdf', name: 'pdftest', version: '7.0.0' testCompile group: 'junit', name: 'junit', version: '4.10' } task copyDependenciesIntoBuildLibsDir( type: Copy ) { from configurations.runtime into"$buildDir/libs/lib" } jar{ dependsOn copyDependenciesIntoBuildLibsDir manifest { attributes 'Main-Class': 'com.mypackage.MyPdfMain' attributes 'Class-Path': configurations.runtime.collect {"lib/" + it.getName()}.join(' ') } } |
我从https://jar-download.com/download-handling.php下载并添加到构建路径kernel-7.1.4 jar和styled-xml-parser.jar及其所有依赖项中,这消除了错误。注意:如果在支持maven的脱机环境中工作,可以通过从项目pom.xml文件所在的位置运行mvn dependency:go offline命令来解决这个问题。
您正在将依赖jar复制到lib目录,并创建应用程序jar。您需要在命令行的类路径中定义它。参考此
另一种方法是,您可以在build.gradle中应用"application"插件:
1 2 3 4 5 6 7 8 9 10 11 | group 'Hello-World' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'application' jar{ manifest { attributes 'Main-Class': 'com.mypackage.MyPdfMain' } } |
然后可以执行
您会发现您的应用程序被压缩到该目录中,您只需从