2016-07-14 16 views
0

Ich verwende Gradle, um ein Testprojekt einzurichten, das itext 7 verwendet, um PDF-Dateien zu generieren.java.lang.NoClassDefFoundError: com/itextpdf/kernel/pdf/PdfWriter itext und gradle

Wenn ich meine Hauptklasse in Netbeans IDE ausführen, funktioniert alles gut; Ein "results" -Ordner wird erstellt und darin finde ich das generierte PDF.

Aber wenn ich das Projekt säubere und baue, gehe in project_folder/build/libs und versuche, java -jar mypdfproject.jar Datei auszuführen, bekomme ich diesen Fehler => java.lang.NoClassDefFoundError: com/iextpdf/kernel/pdf/PDFWriter

dies meine Hauptklasse ist (MyPdfMain.class)

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(); 
    } 
} 

und dies ist der build.gradle

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(' ') 
    } 
} 

wie Sie habe ich eine Aufgabe sehen kann den ganzen de kopieren pendecies Gläser in Builds/libs/lib

Aufgabe copyToLib (Typ: Copy) { in "$ builddir/libs/lib" von configurations.runtime }

und stellen jar { DependsOn copyToLib }

aber der Fehler ist immer noch der gleiche.

Ich denke, es sollte ein Klassenpfadfehler sein, aber ich weiß nicht, wie und wo der Klassenpfad in Gradle gesetzt werden soll. Wie kann ich mein Projekt vom Terminal aus ausführen?

Antwort

0

Sie kopieren die abhängigen JAR-Dateien in das Verzeichnis lib und erstellen die Anwendungs-JAR-Datei. Sie müssen das in Ihrem Klassenpfad in der Befehlszeile definieren. Refer this

Ein anderer Weg sein könnte, können Sie 'Anwendung' Plugin in Ihrem build.gradle gelten:

group 'Hello-World' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 
apply plugin: 'application' 

jar{ 
    manifest { 
     attributes 'Main-Class': 'com.mypackage.MyPdfMain' 
    } 
} 

Dann können Sie gradle build tun, welche Verzeichnisse build/distribution

Sie finden Ihre Anwendung sollte ZIPPED innerhalb dieses Verzeichnisses, das Sie einfach entpacken und die Shell-Datei aus dem Verzeichnis bin ausführen können (die Sie nach dem Entpacken sehen werden. Das entpackte Verzeichnis wird ein Shell-Skript innerhalb des bin-Verzeichnisses haben.).

1

Vielen Dank für Ihre Hilfe. Die Verwendung des Anwendungs-Plugins ist eine gute Lösung! Außerdem fand ich eine andere Art und Weise meine build.gradle zu lösen Wechsel:

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(' ') 
    } 
} 
+0

Wenn die ‚Anwendung‘ Plugin Teil half, können Sie meine Antwort vote up ;-) – gaganbm

+0

Ok. Ich habe dich gerade gewählt, aber leider habe ich weniger als 15 Rufpunkte, also denke ich, dass niemand meine Stimme sehen kann. – Mavek