2013-08-18 15 views
5

Ich versuche, eine Bibliothek zu erstellen, die in anderen Projekten verwendet werden könnte. Ich habe eine Klasse mit mehreren statischen Methoden geschrieben, um etwas zu tun. Ich wollte es ausprobieren, aber ich kann die importierte JAR-Datei nicht verwenden.Java-Bibliotheksdatei mit IntelliJ IDEA erstellen

Ich habe meinen Code als Artefakt kompiliert und die JAR-Datei aus dem Ordner "out" genommen und dann in ein anderes Projekt kopiert. Danach ging ich zu "Projektstruktur", Reiter "Bibliotheken" und ich drückte auf den Plus-Button. Ich habe die JAR-Datei gefunden und ausgewählt, danach hat IDEA mich gebeten, Abhängigkeiten anzugeben, was ich getan habe, aber wenn ich sie im Code verwenden möchte, kann ich das nicht tun. Es kann nicht einmal importiert werden.

Class from library not recognized

Irgendwelche Ideen, warum es meine Bibliothek ignoriert? Vielen Dank!

Was soll ich tun, um eine JAR-Bibliothek mit IntelliJ IDEA zu erstellen, die in anderen Projekten verwendet werden kann?

+0

Ihre Beschreibung ist ein wenig zu vage. Darf ich vorschlagen, dass Sie eine Third-Party-Bibliothek (z. B. etwas von Apache Commons) herunterladen und versuchen, diese in Ihrem Projekt zu verwenden? Nur um das Problem auf die Erstellung des Jars oder dessen Verwendung in einem anderen Projekt zu beschränken. – SJuan76

+0

Ich bin bereit, JSch für SSH-Verbindung auf die gleiche Weise zu verwenden, und es funktioniert einwandfrei. Meine Bibliothek wird jedoch ignoriert. Ich kann die Methoden in der Hauptklasse nicht verwenden und ich kann keine Instanzen der Klasse erstellen, die sich in meiner Bibliothek befindet. – Dropout

+1

Seltsam ... Es ist nichts besonderes, eine JAR-Bibliothek in IDEA zu erstellen und sie in ein Projekt zu importieren außer dass du geschrieben hast (zumindest im allgemeinen Fall). Ich habe gerade versucht, die Schritte in Ihrer Beschreibung zu reproduzieren und hatte keine Probleme. Versuchen Sie zu prüfen, ob Sie Ihre Bibliothek nicht vollständig oder teilweise als ausgeschlossenes Verzeichnis markiert haben. –

Antwort

2

Ich habe herausgefunden, was mein Problem war. Als ich die Bibliothek erstellt habe, habe ich versucht, es einfach zu machen. Zu einfach, leider. Ich hatte ein Paket mit einer Klasse darin, die in ein JAR kompiliert wurde. Struktur wie folgt:

foo 
| 
|_ MyLib.java 

Um Klassen aus einer erstellten JAR-Bibliothek verwenden zu können, müssen sie jedoch in Paketen platziert werden. Das heißt, wenn ich habe:

foo 
| 
|_bar 
| | 
| |_MyInnerLib.java 
| 
|_MyOuterLib.java 

ich in der Lage bin zu importieren und verwenden Methoden aus MyInnerLib aber MyOuterLib nicht erreichbar ist noch importierbar. Das war der Fehler, den ich machte.

+1

Ist "foo" der Name Ihres JAR (d. H. Es ist * foo.jar *)? Der Grund für Ihr Problem könnte dies sein (Zitat aus ["** Die Java-Sprachspezifikation **" Abschnitt 7.5] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-7). html # jls-7.5), Hervorhebung meins): "* Ein Typ in einem unbenannten Paket (§7.4.2) hat keinen kanonischen Namen, so dass die Forderung nach einem kanonischen Namen in jeder Art von Import-Deklaration impliziert, dass (a) ** Typen in einem unbenannten Paket können nicht importiert werden ** und (b) statische Member von Typen in einem unbenannten Paket können nicht importiert werden. * ". – informatik01

5

Sie stoßen auf ein sehr häufiges Abhängigkeitsverwaltungsproblem.

IMO die wirkliche Antwort ist, ein Bausystem wie Maven, Ant oder Gradle zu verwenden (ich würde Gradle selbst gehen). Was Sie versuchen, ist manuell, schwer zu reproduzieren und brüchig.

Jedes Mal, wenn Sie eine Änderung vornehmen, müssen Sie manuelle Schritte ausführen, um ein neues JAR zu erstellen. Und du verstehst deine Abhängigkeiten wirklich nicht.

Um mit den Best Practices alles zu erreichen, müssten Sie ein echtes Build-System haben, das auf einem Continuous Integration Server publiziert, der Tests kompiliert und ausführt. Nach erfolgreichem Abschluss der Tests werden die JARs auf einem Artefaktserver (Nexus/Artifactory) veröffentlicht.

Die Personen, mit denen Sie teilen, würden die JARs über das Build-System verbrauchen, indem sie Abhängigkeiten von Ihrer JAR deklarieren.

+0

Danke für die Info @phil, es ist ein sehr nützlicher Ratschlag, aber ich denke nicht an Updates für die JAR, die ich gerade erstellen möchte. Das Problem ist, dass ich nach dem Import in ein Projekt nicht auf Klassen innerhalb der JAR zugreifen kann. – Dropout