2017-01-09 3 views
1

Sorry für die sehr allgemeine Überschrift und die lange Beschreibung zu folgen. Vielen Dank im Voraus für jeden, der dies liest und antwortet.Java App funktioniert nicht auf der Kommandozeile ist in Eclipse in Ordnung

Ich habe eine App, die ein VM-Argument und ein Befehlszeilenargument nimmt. Es ist ein Maven-Projekt. Ich führe es in Eclipse aus einer Java-Anwendung ausführen Konfiguration. Kein Problem. Es erstellt eine PDF-Datei, und System.out() - Aufrufe werden tatsächlich in STDOUT gedruckt. Protokollierungsaufrufe werden an die Eclipse-Konsole gesendet. Alles wie erwartet.

Als ich in Maven bauen (Ich bin mit git Bash-Shell auf Windows 7):

$ mvn clean compile package 

Das Gefäß mit allen Abhängigkeiten innerhalb und die persistence.xml-Datei erstellt wird enthalten. Ich laufe von der Befehlszeile

$ java -jar target/dne-caprs-reports-0.0.1-SNAPSHOT.jar \ 
    -Dgov.ssa.dne.reportdir=C:\temp\ upcoming_changes 

Keine Fehler. Hurra. Aber ... keine PDF und keine Nachrichten auf STDOUT. Es sollte einige Nachrichten auf STDOUT geben. Ich habe das gesamte Dateisystem nach dem PDF durchsucht, falls sie irgendwo unerwartet ausgegeben wurden. Nichts.

Ich ftped das Glas zu einer Linux-Box und lief es auf die gleiche Weise (mit einem anderen reportdir offensichtlich) und bekam das gleiche Ergebnis. Kein PDF Kein STDOUT. Keine Protokollierung (obwohl ich keine Ahnung habe, ob ich die Protokollierung richtig gemacht habe).

Also "funktioniert nicht" bedeutet, dass die App läuft gut, außer keine Ausgabe auf STDOUT und keine PDF-Datei erstellt wird. UND überhaupt keine Fehler.

Hauptklasse: RunReport.java: -:

public class ChangeStatusReport { 

    private EntityManager em; 
    private List<Sc6cm3rm1> changeList = new ArrayList<Sc6cm3rm1>(); 
    private Cell cell; 
    private Table table; 
    private String title; 
    private static final Logger LOGGER = Logger.getLogger(ChangeStatusReport.class.getName()); 

    public ChangeStatusReport(EntityManager em, String title) { 
     this.em = em; 
     this.title = title; 
    } 

    public void generateReport() { 
     Query q = em.createNativeQuery(NativeQueries.DNE_CHANGE_STATUS, Sc6cm3rm1.class); 
     changeList = q.getResultList(); 
     createPdf(); 
    } 

    private void createPdf() { 

     String reportLocation = System.getProperty("gov.ssa.dne.reportdir"); 
     String report = reportLocation + "DNE_Change_Status_" + DneStyles.reportSdf.format(new Date()) + ".pdf"; 

     try { 
      PdfWriter writer = new PdfWriter(report); 
      PdfDocument pdf = new PdfDocument(writer); 
      Document document = new Document(pdf, PageSize.A4.rotate()); 

      // Add title 
      document.add(pdfTitle); 

      table = new Table(new float[] { 8, 8, 8, 35, 12, 12, 3, 20 }); 

      document.add(table); 
      document.close(); 
      LOGGER.log(Level.INFO, "report complete " + report); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

pom.xml

<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>gov.ssa.dne.nmst</groupId> 
    <artifactId>dne-caprs-reports</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>dne-caprs-reports</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.4.3</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer 
        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <mainClass>gov.ssa.dne.app.RunReport</mainClass> 
       </transformer> 
       <transformer 
        implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
        <resource>META-INF/persistence.xml</resource> 
        <file>src/main/java/META-INF/persistence.xml</file> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencies> 
    <LONG LIST OF DEPENDENCIES REMOVED> 
    </dependencies> 

</project> 

Was

package gov.ssa.dne.app; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

import gov.ssa.dne.reports.ChangeStatusReport; 
import gov.ssa.dne.reports.OpenChangesReport; 
import gov.ssa.dne.reports.OpenProblemReport; 
import gov.ssa.dne.reports.UpcomingChangesReport; 

public class RunReport { 

public static void main(String[] reports) { 

    EntityManagerFactory factory = Persistence.createEntityManagerFactory("dne-caprs-reports"); 
    EntityManager em = factory.createEntityManager(); 

    if (reports[0].toString().equals("change_status")) { 
     ChangeStatusReport report = new ChangeStatusReport(em, "DNE Change Status"); 
     System.out.println("CHANGE STATUS REPORT"); 
     report.generateReport(); 
    } 


} 

}

ChangeStatusReport.java Details der Kürze halber entfernt geht hier? Ich habe andere Antworten gelesen, die sich mit dem STDOUT-Problem befassten, aber diese Fragen betrafen Menschen, die versuchten, das jar als ausführbare Datei ohne den "java-jar" -Teil auszuführen. Ich tue das nicht. Hat es mit meinem Maven Build zu tun? Wie ich es betreibe? Ich kann mir nichts anderes vorstellen.

+0

Es sieht so aus, als ob Sie auf einer Windows-Maschine laufen, aber vielleicht mit einer Bash-Eingabeaufforderung? Das Verzeichnis Argument sieht eigenartig aus, haben Sie versucht -Dgov.ssa.dne.reportdir = C: \\ temp \ entering_changes (den Backslash zu entkommen, entfernen Sie das Leerzeichen vor der bevorstehenden) –

+0

Haben keine stdout ist eigenartig. Wenn du das Hauptgerät durch eine einfache "Hallo Welt" ersetzt, sollte es einfach "funktionieren" ... Auch wenn du es schattierst .. Reduziere dein Problem, um zu sehen, ob du etwas Grundlegendes erhalten kannst, bevor du es erweiterst. Du hättest definitiv etwas sehen sollen. –

+0

@ lane.maxwell Ich verwende eine "git bash" Shell auf Windows. Das sind großartige und einfache Vorschläge. Danke euch beiden. Klar habe ich das zu lange her gesehen! Ich habe mit dem 2. Vorschlag angefangen. Sicher genug ein einfaches Java-Glas, das nicht mehr als "Hallo Welt!" Genau das tat STDOUT. Ich werde von dort weitermachen und alles, was ich finde, veröffentlichen. – april26

Antwort

0

Die Aktion meiner Anwendung hing von der ordnungsgemäßen Verarbeitung des Befehlszeilenarguments ab, was ich nicht tat. Hier

ist die Definition von main() von RunReports.java:

public static void main(String[] reports) 

Bevor etwas Aktion zu tun, müssen wir eine Befehlszeilenargument entsprechen:

if (reports[0].equals("change_status")) { 
    // do something 
} 

Aber da hatte ich Richte die Kommandozeile falsch ein, dh mit dem JVM-Argument NACH der JAR-Datei wurde es Teil von Reports [0]. Als ich herausfand, wie ich auf STDOUT drucken kann (siehe Kommentar oben), konnte ich sehen, was vor sich ging.

mein Befehlszeilenargument Druck
reports[0] 

ergab

-Dgov.ssa.dne.reportdir=C:\temp\ upcoming_changes 

, die offensichtlich nicht

upcoming_changes 

So nichts Mysteriöses hier überein. Ich musste einige Dinge umschalten und den Pfad zu C: \ temp per @ lane.maxwell anpassen und alles funktionierte.

Schlussbefehlszeilenanweisung

java -Dgov.ssa.dne.reportdir="C:\\temp" -jar dne-caprs.jar upcoming_changes 

Der Grund, warum dieses Problem in Eclipse nicht aufgetreten ist folgend:

In der Java-Anwendung ausführt Konfiguration gibt es ein Argument Registerkarte. Auf der Registerkarte Argumente gibt es einen VM-Abschnitt, in dem ich das VM-Argument und einen Programmargumentabschnitt, in dem ich die Programmargumente ablege, platziere.

Da ich die Konfiguration korrekt in Eclipse eingerichtet habe, lief es richtig.

Verwandte Themen