2016-07-25 11 views
0

Also, meine Paketstruktur ist, dass ich einen src-Ordner mit meinem Code habe und darin einen exec-Ordner habe eine Klasse und drei Methoden, meine Hauptklasse und zwei Gläser.Kompilieren von jar vom Terminal, Ausnahme: "error: package au.com.bytecode.opencsv existiert nicht '"

Meine exec Klasse sieht wie folgt aus:

package com.xxx.exec; 

import au.com.bytecode.opencsv.CSVReader; 


import java.io.*; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 
import java.nio.charset.StandardCharsets; 

/** 
* Created by xxx on 24/07/16. 
*/ 

public class ApiAccess { 

    public void getConsoleInput() throws Exception { 
     Console console = System.console(); 
     if (console == null) { 
      throw new Exception("Unable to fetch console"); 
     } 
     System.out.println("Please enter the location:"); 
     getAPIData(console.readLine()); 
    } 

    private void writeCsv(InputStream input) { 
     try { 
      CSVReader locationData = new CSVReader(new InputStreamReader(input)); 
      locationData.close(); 
      System.out.println(input); 
     } 
     catch (Exception e) { 
      System.out.println("Something went wrong while creating the csv:" + e); 
     } 

    } 

    private void getAPIData(String location) throws IOException { 
     String url = "http://exec.goeuro.com/exec/v2/position/suggest/en/"; 
     String charset = StandardCharsets.UTF_8.name(); 

     String query = String.format(url + "%s", URLEncoder.encode(location, charset)); 
     URLConnection connection = new URL(query).openConnection(); 
     connection.setRequestProperty("Accept-Charset", charset); 

//  String line; 
//  StringBuilder text = new StringBuilder(); 
//  BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 
//  while((line = reader.readLine()) != null) { 
//   text.append(line).append(" "); 
//  } 
// 
//  writeCsv(text.toString()); 
     writeCsv(connection.getInputStream()); 

    } 
} 

Mein Terminal-Befehl wie folgt aussieht:

javac -cp ".:lib/*:opencsv-2.41.jar" -d src $(find ./src/* | grep .java) 

Und ich bekomme diese Fehlermeldung:

./src/com/goeuro/exec/ApiAccess.java:3: error: package au.com.bytecode.opencsv does not exist 
import au.com.bytecode.opencsv.CSVReader; 
          ^
./src/com/goeuro/exec/ApiAccess.java:29: error: cannot find symbol 
      CSVReader locationData = new CSVReader(new InputStreamReader(input)); 
      ^
    symbol: class CSVReader 
    location: class ApiAccess 
./src/com/goeuro/exec/ApiAccess.java:29: error: cannot find symbol 
      CSVReader locationData = new CSVReader(new InputStreamReader(input)); 
             ^
    symbol: class CSVReader 
    location: class ApiAccess 
3 errors 

Danke im Voraus für irgendwelche Antworten!

Aktuelle dir Struktur (Ich habe einen umgekehrten Schrägstrich vor Verzeichnisse):

/src > 
     -/com.xxx > 
       -Main.java, 
        -/exec > 
         -ApiAccess, 
         -opencsv-2.41.jar > 
             -/au.com.bytecode.opencsv, 
         -commons-lang3-3.0.1.jar 

enter image description here

+0

Bitte zeigen Sie uns die Speicherorte der JAR-Dateien relativ zum aktuellen Verzeichnis an. –

+0

@StephenC Hey, ich habe die Struktur hinzugefügt :) – Ozymandias

+0

Ich warte auf Sie zu beheben, so dass es 1) lesbar und 2) genau ist –

Antwort

0

Ich bin noch nicht überzeugt, ich verstehe Ihre Verzeichnisstruktur. Ihr ASCII und Bild scheint zu sagen, dass Sie JAR-Dateien 3 oder 4 Ebenen tief im Verzeichnis >> source < < versteckt haben, was (IMO) ein bisschen verrückt ist.

Stattdessen empfehle ich die folgende Struktur:

src/ 
    com/ 
     xxx/ 
      Main.java   // class name "com.xxx.Main" 
      exec/ 
       APIAccess.java // class name "com.xxx.exec.APIAccess" 
lib/ 
    opencsv-2.41.jar 
    commons-lang3-3.0.1.jar 
classes/ 
    com/ 
     xxx/ 
      Main.class 
      exec/ 
       APIAccess.class 

und übersetzen Sie die Klassen wie folgt aus:

javac -cp "classes:lib/*" -d classes $(find src/* | grep .java) 

Und wie die Anwendung wie folgt ausführen:

java -cp "classes:lib/*" com.xxx.Main 

Auffallende Punkte über das oben genannte:

  • Die Baumstruktur "src" muss die Paketstruktur mit den Java-Dateien widerspiegeln, die an der von der Paketbenennung vorgegebenen Stelle angezeigt werden.
  • Die „Klassen“ Baum getrennt ist, so dass:
    • ist es einfach, eine JAR ohne Quellcode
    • es ist einfach zu „sauber“, die „.class“ Dateien
    • Sie don‘zu erstellen Ich muss mir Gedanken darüber machen, ".class" -Dateien versehentlich in die Versionskontrolle zu übernehmen.
  • Der Baum "Klassen" spiegelt natürlich die Paketstruktur wider. Der Compiler wird sich darum kümmern.
  • Das Verzeichnis "lib" ist vom Verzeichnis "src" getrennt.
    • Es ist leicht zu finden.
    • Punkte wie oben über Versionskontrolle. Beachten Sie, dass es eine schlechte Übung ist, externe Abhängigkeiten in der Versionskontrolle zu überprüfen.

(Wenn Sie nicht die Versionskontrolle verwenden, sollten Sie lernen, wie das zu tun. Es Ihnen eine Menge Schmerz erspart. Auch auf ein Java-Build-Tool beim Einschalten aussehen. Bei Tool Sehen Sie wie Maven und Gradle, die gut mit externen Abhängigkeiten umgehen können.)