Class.class.getResource(...)

Status
Nicht offen für weitere Antworten.

mongole

Mitglied
Hallo,

Die Frage ist sicher ein Klassiker, aber irgendwie klappt es bei mir nicht.

Die Methode
Java:
Class.class.getResource(String)
liefert die URL für eine Datei im Classpath zurück. Das funktioniert bei mir auch, wenn ich die gesuchte Datei im /bin Verzeichnis von meinem Eclipse Projektverzeichnis habe.

Wenn ich das Projekt jetzt aber als .jar packe und Konfig Datei ausserhalb des .jar Files im gleichen Verzeichnis liegen haben, sollte es eigentlich mit dem Aufruf
Code:
java -cp . -jar Program.jar
auch funktionieren, aber ich bekomme immer nur null zurück.

Was hab ich übersehen? Gibt es einen anderen Weg eine Datei zu öffnen, die im Verzeichnis des .jar Files liegt? Absolute Pfade funktionieren nicht, da ich nicht weiß, wo das .jar landen wird.

Danke und lg,
mongole
 
B

Beni

Gast
Wirf deine Dateien in das src Verzeichnis, sie werden dann in das bin Verzeichnis kopiert (IMHO sogar automatisch). Und wenn du ein JAR machst, werden sie dann in das JAR gepackt, das ist notwendig damit getResource die Daten findet.

Das bin Verzeichnis wird von Eclipse verwaltet, in diesem Verzeichnis sollte man besser garnichts ändern/spechern/löschen...
 

-MacNuke-

Bekanntes Mitglied
Was hab ich übersehen? Gibt es einen anderen Weg eine Datei zu öffnen, die im Verzeichnis des .jar Files liegt?

Etwas umständlich, aber ich habe bisher auch nichts anderes gefunden:

Java:
String file = this.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
int index = file.lastIndexOf("/");
String path = file.substring(0, index);
//path benutzen

@Beni

Nicht alles möchte man ins Jar legen. z.B. feste, nicht User-bezogene Programmkonfigurationen wie Datenbank-Adressen usw.
 
Zuletzt bearbeitet:

mvitz

Top Contributor
Wenn die Config Datei zwangsweise irgendwo in einem Ordner liegen muss, dann reicht es imho, den Ordner (oder explizit die Datei) mit in den Classpath aufzunehmen. Danach funktioniert getResource() dann wieder.

z.B. so:
Code:
java -cp config.xml -jar Test.jar

Wobei, ich bin mir gerade nicht sicher, ob bei -jar überhaupt das cp ausgewertet wird. Da gäbe es dann die Möglichkeiten

a)
Code:
java -cp config.xml;Test.jar de.test.Main
b) Manifest in die JAR, in der auch die config.xml einbezogen wird.
 

mongole

Mitglied
Hi,

Danke für die Tipps! Der Grund für die Trickserei ist, dass ich die config, wie schon von einigen vermutet, nicht im jar haben möchte. Es ist ein kleines Tool, das mir Verzeichnise die im config File angegeben sind säubert. Alles was älter als 2 Wochen ist, soll raus. Da will ich nicht jedes mal ein neues jar machen müssen, wenn ich den Pfad ändere...

@Beni: So war's eh gemeint mit dem bin verzeichnis. Original in src, kopie von eclipse verwaltet in bin....

@MacNuke: Den Ansatz finde ich interessant. Leider hab ich bei this.class.getProtectionDomain().getCodeSource() auch null zurückbekommen.

@habi55: Genau das war die zugrunde liegende Idee. Das Problem war wirklich, dass die Kombination aus -cp und -jar nicht funktioniert. Deine Variante 2 hat dann anstandslos funktioniert. Find ich aber echt bescheuert das Verhalten, dass man bei -jar einen Classpath angeben kann, der aber einfach ignoriert wird. Ist nicht gerade intuitiv. Mit dem File direkt im Classpath hat's nicht geklappt. Das hat wieder null zurückgeliefert.

Aja, wie würde man denn das file im Manifest angeben? Wenn ich den vollen Pfad oder nur den Dateinamen angegeben hab, dann hab ich folgende Meldung bekommen: java.io.FileNotFoundException: file:/Users/andi/Temp/TempCleaner.jar!/tempclean.conf (No such file or directory)

lg,
Mongole
 

mvitz

Top Contributor
./conf.xml

Afaik. . sollte bei -jar aufruf immer das Verzeichnis sein, dass die JAR enthält.
 

mongole

Mitglied
@habi55: . steht für aktuelles verzeichnis. wenn ich wo anders stehe und java -jar /absolut/path/to.jar angebe, dann bekomm ich nicht das verzeichnis vom jar file für den punkt. das mit dem Class-Path: ./file im manifest hat bei mir nicht funktioniert.

weder mit java -jar ... noch mit java -cp ... aber egal. jetzt hab ich ja einen weg, wie ich es starten kann.

@MacNuke: Ahhh! Jetzt funktionierts :) Hab's mit Class.class.get....()... versucht. Manchmal sollt man doch die API docs lesen.


Danke an euch alle! Wieder was gelernt :)

lg,
mongole
 

mvitz

Top Contributor
kk, ich weis nur definitiv, dass es auch über das Manifest geht. Nur leider nicht mehr 100% wie. Hab hier jetzt auch gerade kein JDK, werde es morgen aber dann nochmal versuchen, ist meiner Meinung nach, nämlich der wesentlich elegantere Weg.
 

mvitz

Top Contributor
So :D

Also, im MANIFEST.MF wird der . als Verzeichnis, in dem sich das JAR File befindet gedeutet.

Zum ausprobieren (benötigt ANT)

[XML]<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="default" basedir=".">

<property name="src" value="${basedir}/src" />
<property name="dest" value="${basedir}/build" />

<target name="default">
<mkdir dir="${src}" />
<mkdir dir="${src}/de" />
<mkdir dir="${dest}" />

<echo file="${src}/de/Test.java">package de;

import java.net.URL;

public class Test {

public static void main(String[] args) {
URL url = Test.class.getClassLoader().getResource("test.xml");
System.out.println(url);
}

}
</echo>
<echo file="${basedir}/test.xml"></echo>

<javac srcdir="${src}" destdir="${dest}" />

<jar basedir="${dest}" destfile="${basedir}/test.jar">
<manifest>
<attribute name="Main-Class" value="de.Test" />
<attribute name="Class-Path" value="." />
</manifest>
</jar>

<delete dir="${src}" />
<delete dir="${dest}" />
</target>

</project>[/XML]

Anschließend kann per java -jar /path/to/test.jar von überall das JAR gestartet werden, und er findet die test.xml.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Problem mit Class.getResource() in einer Jar-Datei Allgemeine Java-Themen 4
D NoClassDefFoundError: Could not initialize class Allgemeine Java-Themen 0
J Class to link Java Allgemeine Java-Themen 4
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
T Java Robot Class - Bot Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
G javafx "class path" exception Allgemeine Java-Themen 5
S Java class direved from inner class Allgemeine Java-Themen 6
S Inner Class Allgemeine Java-Themen 11
K Wildcard und class type Allgemeine Java-Themen 9
M Java model class ? Allgemeine Java-Themen 9
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S class path resource [config.properties}] cannot be opened because it does not exist Allgemeine Java-Themen 4
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
J Class Decompile als String (Procyon) Allgemeine Java-Themen 2
H Class 'java.io.BuferedReader' is not present in JRE Emulation Libary | GWT Fehler?! Allgemeine Java-Themen 0
I Datentypen String in class sicher verwahren Allgemeine Java-Themen 17
R Dynimc Class Loading Allgemeine Java-Themen 5
J Inner class + Leer-Konstruktor Allgemeine Java-Themen 1
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
V Eclipse .class Dateien Allgemeine Java-Themen 9
KeexZDeveoper Von .class zu .java Allgemeine Java-Themen 7
N Wo ist Object.class ? Allgemeine Java-Themen 0
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
M *.class Files ausführen Allgemeine Java-Themen 2
L Klassen Nested Class In Nested Class Allgemeine Java-Themen 3
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Tort-E Manifest Main-Class Allgemeine Java-Themen 8
I JSoup Class auslesen Allgemeine Java-Themen 1
K Generic class und Reflection Allgemeine Java-Themen 2
R .class Datei in .jar austauschen Allgemeine Java-Themen 2
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
A main-class Not found Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
P JDK installieren Error: Could not find or load main class HelloWorld.java Allgemeine Java-Themen 3
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T Hash von *.class-Datein überprüfen Allgemeine Java-Themen 1
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
Phash Can't find Main Class Allgemeine Java-Themen 4
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
B json zu java class Allgemeine Java-Themen 2
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
D Class<CAP#1> statt Class<...> Allgemeine Java-Themen 5
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
L Class Files , Methode .delete() Allgemeine Java-Themen 13
E NetBeans warning: [options] bootstrap class path not set in conjunction with -source 1.6 Allgemeine Java-Themen 4
X Could not find the main class programm will exit (textdokument) Allgemeine Java-Themen 3
S Could not find the main class Allgemeine Java-Themen 7
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
B Variable class in java.lang.Object Allgemeine Java-Themen 11
C Could not find the main class. Allgemeine Java-Themen 15
S Klassen .jar - eine .class datei ändern? Allgemeine Java-Themen 23
A Could not find main class: start Allgemeine Java-Themen 5
S main() class finden Allgemeine Java-Themen 7
hdi Could not find main class? Allgemeine Java-Themen 8
R Warum Class.forName(); Allgemeine Java-Themen 7
C class.class angefordert ? Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
B Test$1.class mit dem javac compiler Allgemeine Java-Themen 7
G jar Datei findet Main Class nicht... Allgemeine Java-Themen 2
P Java Editor Could not find the main class GUI. Programm will exit. Allgemeine Java-Themen 3
D class Datei einlesen Allgemeine Java-Themen 4
T Interface > Abstract > Class Allgemeine Java-Themen 11
TheDarkRose Subversion .class Dateien auch commiten? Allgemeine Java-Themen 3
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
E String name in class convertieren Allgemeine Java-Themen 4
F Änderung in .jar bzw. .class vornehmen ? Allgemeine Java-Themen 18
H2SO3- bestimmte class immer mit 1.4 compilieren Allgemeine Java-Themen 5
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
G Unterschied MyClass.class vs this Allgemeine Java-Themen 2
S mit Class eine Klasse nur einmal instantiieren Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
BattleMaster246 Could not find the Main class Allgemeine Java-Themen 30
N class Task extends TimerTask ohne Blockieren Allgemeine Java-Themen 15
H .class in .java umwandeln Allgemeine Java-Themen 3
T class.newinstance + try/catch-konstruktor Allgemeine Java-Themen 6
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
J Class.forName und CLASSPATH -Problem Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
G Thread in Methode oder in inner class Allgemeine Java-Themen 3
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
reibi Main-Class in Jarfile Allgemeine Java-Themen 3
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
D Class.forName Allgemeine Java-Themen 2
S Class RGB Farbe Allgemeine Java-Themen 2
S JavaDoc aus .class Datei extrahieren Allgemeine Java-Themen 5
N Probleme mit .jar 'Could not find main class' Allgemeine Java-Themen 3
T Class Not Found Exception beim import von Paket Allgemeine Java-Themen 2
G Abstract class Stillfrage Allgemeine Java-Themen 4
P Class Casting: Graphics/Graphics2D Allgemeine Java-Themen 7
H2SO3- abstract class mit Beispielen in abstracten Methoden Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben