2016-07-14 3 views
0

Я использую Gradle для установки тестового проекта, который использует itext 7 для генерации pdf-файлов.java.lang.NoClassDefFoundError: com/itextpdf/kernel/pdf/PdfWriter itext и gradle

Если я запускаю свой основной класс в Netbeans IDE, все работает нормально; создается папка «results», и внутри нее я могу найти сгенерированный PDF-файл.

Но если я чищу и создаю проект, зайдите в project_folder/build/libs и попробуйте выполнить java -jar файл mypdfproject.jar. Я получаю эту ошибку => java.lang.NoClassDefFoundError: com/itextpdf/kernel/pdf/PDFWriter

это мой основной класс (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(); 
    } 
} 

и это 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(' ') 
    } 
} 

, как вы можете видеть, что я создал задачу, чтобы скопировать все де pendecies банки в строит/Libs/Библиотека

задачи copyToLib (тип: Копировать) { в "$ buildDir/LIBS/Библиотека" от configurations.runtime }

и установить банку { dependsOn copyToLib }

, но ошибка все тот же.

Я думаю, что это должна быть ошибка класса, но я не знаю, как и где установить путь к классам в Gradle. Как я могу запустить свой проект с терминала?

ответ

0

Вы копируете зависимые баночки в каталог lib и создаете свою прикладную банку. Вам нужно определить, что в вашем пути к классам в командной строке. Refer this

Другой способ может быть, вы можете применить «приложение» плагин в вашем build.gradle:

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

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

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

Затем вы можете сделать gradle build, которые должны создавать каталоги build/distribution

Вы найдете приложение zipped внутри этого каталога, который вы можете просто распаковать и выполнить файл оболочки из каталога bin (который вы увидите после распаковки. В распакованном каталоге будет сценарий оболочки внутри каталога bin).

1

Благодарим за помощь. Использование плагина приложения является хорошим решением! Кроме того, я нашел еще один способ решить меняю 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 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

Если «приложение» плагин часть помогла, вы можете проголосовать мой ответ до ;-) – gaganbm

+0

Ok. Я только что проголосовал за вас, но, к сожалению, у меня меньше 15 очков репутации, поэтому я думаю, что никто не может видеть мой голос. – Mavek

Смежные вопросы