2017-03-31 2 views
0

Ich habe Schwierigkeiten, ein einfaches Programm auszuführen, das Apache POI verwendet, um ein Excel-Dokument zu erstellen. Dies ist auch mein erstes Mal mit einem Maven-Projekt, so dass vielleicht etwas damit zu tun haben:Ausführen von .jar-Datei mit Apache POI in Maven-Projekt

Mein pom.xml sieht wie folgt aus:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>calendar</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>calendar</name> 
    <url>http://maven.apache.org</url> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
      <groupId>org.apache.poi</groupId> 
      <artifactId>poi</artifactId> 
      <version>3.10-FINAL</version> 
    </dependency> 


    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.10-FINAL</version> 
    </dependency> 

    </dependencies> 
</project> 

Von dem, was ich sagen kann, meine Abhängigkeiten sind in Ordnung .

Das ist mein Java-Code, ich über Import-Anweisungen übersprungen, aber sie sind alle da, keine Fehler in diesem Code von dem, was ich sagen kann:

public class App 
{ 

    private static final String FILE_NAME = "/tmp/MyFirstExcel.xlsx"; 

    public static void main(String[] args) throws IOException 
    { 
     XSSFWorkbook workbook = new XSSFWorkbook(); 
     XSSFSheet sheet = workbook.createSheet("Datatypes in Java"); 

     Object[][] datatypes = { 
      {"Datatype", "Type", "Size(in bytes)"}, 
      {"int", "Primitive", 2}, 
      {"float", "Primitive", 4}, 
      {"double", "Primitive", 8}, 
      {"char", "Primitive", 1}, 
      {"String", "Non-Primitive", "No fixed size"}  
     }; 

     int rowNum = 0; 
     System.out.println("Creating excel"); 
     for(Object[] datatype : datatypes) { 
      Row row = sheet.createRow(rowNum++); 
      int colNum = 0; 
      for(Object field : datatype) { 
       Cell cell = row.createCell(colNum++); 
       if(field instanceof String) { 
        cell.setCellValue((String) field); 
       } 
       else if(field instanceof Integer) { 
        cell.setCellValue((Integer) field); 
       } 
      } 
     } 

     try { 
      FileOutputStream outputStream = new FileOutputStream(FILE_NAME); 
      workbook.write(outputStream); 
      //workbook.close() 
     } catch (FileNotFoundException e) { 
      System.out.println("Couldn't find file to write out to"); 
     } catch (IOException e) { 
      System.out.println("IO Exception in printing"); 
     } 

    } 
} 

Ich habe workbook.close() da dies einen Fehler verursacht, kommentierte out (veraltete Methode?).

Mit dem obigen Code in meinem Quellordner kann ich mvn package ausführen, die erfolgreich erstellt und generiert die .jar-Datei calendar-1.0-SNAPSHOT.jar im Zielordner.

Ich bin versucht, diese Datei

java -cp target/calendar-1.0-SNAPSHOT.jar com.mycompany.app.App 

... und ich bekomme die folgende Fehlermeldung

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook 
     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Workbook 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 7 more 

Wenn diese Frage erfordert mehr Informationen lassen Sie mich wissen, mit laufen. Ich bin hier ratlos.

+1

Schauen Sie hier: http://stackoverflow.com/a/574650 Sie benötigen Maven-Montage-Plugin, da im Glas nur Ihre Klassen. –

+0

Warum verwenden Sie eine alte Version von Apache POI? Warum nicht das Neueste? – Gagravarr

+0

Vielen Dank für Ihre Antwort! Ich folgte schließlich dem Link Alex gesendet und erreichte diesen Beitrag: http://StackOverflow.com/Questions/1814526/Problem-building-Executable-Jar-With-Maven, die mir die Antwort gab, die ich brauchte. –

Antwort

1

Sie müssen ein Fett/Uber Glas mit Maven Assembly Plugin erstellen. Das bedeutet, ein Jar zusammen mit seinen Abhängigkeits-Jars in einer einzigen ausführbaren Jar-Datei zu erzeugen. Wenn Sie es ausführen, wären alle Abhängigkeiten verfügbar.

Hinzufügen in Ihrem POM folgende Plugin

<build> 
    <plugins> 
     <!-- Maven Assembly Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4.1</version> 
      <configuration> 
       <!-- get all project dependencies --> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <!-- MainClass in mainfest make a executable jar --> 
       <archive> 
        <manifest> 
        <mainClass>com.your.path.to.main.App</mainClass> 
        </manifest> 
       </archive> 

      </configuration> 
      <executions> 
       <execution> 
       <id>make-assembly</id> 
            <!-- bind to the packaging phase --> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       </execution> 
      </executions> 
     </plugin> 

    </plugins> 
</build> 

Run folgende:

mvn package 

Zwei JAR-Dateien werden im Zielordner erstellt werden.

calendar-1.0-SNAPSHOT.jar – Only your project classes 
calendar-1.0-SNAPSHOT-with-dependencies.jar – Project and dependency classes in a single jar. 

Sie können es folflwoing ausführen;

java -cp target/calendar-1.0-SNAPSHOT-with-dependencies.jarcom.mycompany.app.App 

Sie können den Inhalt des Kalenders-1.0-SNAPSHOT-with-dependencies.jar Bewertung

jar tf target/calendar-1.0-SNAPSHOT-with-dependencies.jar 
0

Das Problem ist, dass bei der Kompilierung POI-Bibliotheken verfügbar sind, aber nicht zur Laufzeit. Der Grund, warum sie verfügbar sind, ist, dass sie in Maven Dependency sind. Außerdem sehe ich keinen Build-Wrapper in Ihrer Pom-Datei. Sie müssen einen Build-Wrapper hinzufügen, um eine JAR-Datei zu erstellen, die Sie außerhalb Ihrer IDE ausführen können.

Jetzt zurück zu Ihrem Problem, entweder müssen Sie POI-Jar in Ihrer CLASSPATH-Umgebungsvariable hinzufügen, so dass Java-Laufzeit kann darauf zugreifen oder bauen ein Fett Glas einschließlich Abhängigkeiten.

Sie können diese Vorlage verwenden, um einen Build-Wrapper in der Pom-Datei hinzuzufügen, um jar mit Abhängigkeiten zu erstellen.

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
      <execution> 
      <phase>install</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
0

Maven package Aufgabe packt gerade kompilierten Klassen Ihres Projekts in einer einzigen JAR-Datei. Alle Bibliotheken von Drittanbietern sind nicht enthalten, deshalb erhalten Sie Fehler - POI-Klasse wurde nicht gefunden.

Sie sollten eine runnable jar Datei erstellen, die alle Abhängigkeiten enthält. Bitte, beziehen Sie sich auf this Frage - Sie sollten einige zusätzliche maven Plugins verwenden, um das zu erreichen

1

Sie verpacken Ihre Maven Artefakt als ein Glas und standardmäßig ein Jar von der Maven Jar-Plugin verpackt nicht die Abhängigkeit Gläser mit der Artefakt gebaut. Während die fehlende Klasse zur Laufzeit.

Wenn Sie Abhängigkeits-Jars Ihrer Anwendung in Ihr jar einfügen möchten, sollten Sie das Maven-Assembly-Plugin verwenden und jar-with-dependencies für den Parameter descriptorRef angeben.

Sie können die Assembly single Zielausführung an die Paketphase binden, sodass die Ausführung mvn package, die Sie verwenden, das erwartete Jar automatisch erstellt.

<plugins> 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <archive> 
     <manifest> 
      <mainClass>YourMainClassPrefixedByItsPackage</mainClass> 
     </manifest> 
     </archive> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> <!-- bind to the packaging phase --> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin>