Datei neben jar-file ansprechen?

Hallo Leute,

ich habe mir ein jar-file gebastelt. In diesem gibt es eine Methode main() in einer Main.class in einem Package namens com.xyz.hope.src.

Nun möchte ich in der main-Methode, die aufgerufen wird mit java -jar test.jar (wird in Manifest.mf festgelegt), eine Datei parsen, die direkt neben diesem jar-file liegt. Um das nochmal konkret darzustellen:

jar-file liegt in: home/bs/test/test.jar
Datei zum parsen liegt in: home/bs/test/test.txt

Wenn ich einfach nur „.“ als Directory-Name eingebe, dann sucht er nach der Datei, die ich parsen möchte, nicht im Verzeichnis des jar-files, sondern in dem Verzeichnis, in dem ich das jar-file aufrufe. Bspl:

Aufruf des jar-files in Verzeichnis: /home/bs/java -jar /test/test.jar
Gesucht wird in Verzeichnis /home/bs/ und nicht im Verzeichnis home/bs/test, wie es wünschenswert wäre…

Irgendjemand ne Idee, wie ich das gewünschte bewerkstelligen kann?

Bis denne und besten Dank im voraus,

Bernd

Schau mal ein Stückchen weiter unten, da gibts eine Thread „frage zu jar“, da findest du deine Antwort. :smile:

Grüße, Robert

Ähm, genau _das_ meinte ich aber nicht :smile:

Schau mal ein Stückchen weiter unten, da gibts eine Thread
„frage zu jar“, da findest du deine Antwort. :smile:

Hallo Robert,

aber genau das Problem, was er da hat, habe ich doch eben nicht :smile: Ich möchte meine Dateien, die ich parsen möchte, nicht direkt im jar halten, sondern eben in einem Verzeichnis daneben. So sieht’s konkret aus:

 jar-file: home/bs/test/test.jar
 fileToParse: home/bs/test/files/test.txt

Und wie schaffe ich es nun, dass die Datei test.txt vom jar aus gefunden wird?

Anbei: wenn die test.txt im jar liegen würde, dann wäre es einfach, anstatt mit dem Classloader einen Ressourcenpfad zu setzten, einfach ein new File(PACKAGE, „test.txt“) machen, wobei PACKAGE z.B. „com/abc/xyz/src/“ sein könnte, also das Package, respektive unterschiedlichen Pfadtrennungszeichen (File.separatorChar).

Aber wie bekomme ich nun mein Problem in den Griff?

Bis denne,

Bernd

Und wie schaffe ich es nun, dass die Datei test.txt vom jar
aus gefunden wird?

Aso, sorry, das habe ich komplett falsch verstanden. :o)

Vielleicht gibts eine Möglichkeit den Pfad eines bestimmten Jars aus dem CLASSPATH abzufragen, keine Ahnung.

Ich würde es eher so lösen, dass du das Programm halt über eine Batch-Datei in deinem Hauptverzeichnis startest.

Du kannst dann im Programm immer davon ausgehen, dass der aktuelle Pfad dem Pfad der Batch-Datei entspricht und kannst dann deine Datei mit dem relativen Pfad dazu öffnen. Also einfach „test\test.txt“ zum Beispiel.

Grüße, Robert

Hi,

ich habe eine Lösung entwickelt, die Dir hoffentlich helfen wird:
import java.security.*;
import java.io.File;
import java.net.*;

public class TestClass
{
void printClassName()
{
Class klasse = this.getClass();
System.out.println("classname : " + klasse.getName());
URL sourceURL = klasse.getProtectionDomain().getCodeSource().getLocation();
System.out.println("URL: " + sourceURL);
try
{
URI sourceURI = new URI(sourceURL.toString());
File source = new File(sourceURI);
System.out.println("File : " + source.getAbsolutePath());
}
catch (URISyntaxException e)
{}
}

public static void main(String[] args)
{
TestClass instanz = new TestClass();
instanz.printClassName();
}
}

Enjoy it.

Ben Janus

Nope, nur ne Reihe neuer Probleme :smile:

ich habe eine Lösung entwickelt, die Dir hoffentlich helfen
wird:

Erstmal vielen Dank für Deine Mühe! Find ich toll von Dir!

Folgende Probleme habe ich bekommen:

1.) URI hat mir zuerst gar nix gesagt, bis ich dann in die Java 1.4 API geschaut habe. Allerdings muss ich diesen Wurf unter JDK 1.3.1_02 hinbekommen.

2.) Wenn ich die Datei exakt so, wie Du das gemacht hast, erstelle, kompiliere und ausführe, dann findet Java die Klasse und gibt mir zumindest noch die URL an (Rest nicht wegen 1.)).
Aber: Wenn ich nun die TestClass-Klasse mit der Zeile

 package com.xyz.abc.src;

versehe, werde ich nicht mehr glücklich. Java schlägt mir dann eine NoClassDefFoundException um die Ohren: com/xyz/abc/src/TestClass (wrong name: TestClass).
Gleiches geschieht übrigens auch, wenn ich TestClass keinem Package zuordne und im Ordner Test belasse, dann mich einen Ordner höher bewege und von dort aus versuche, TestClass auszuführen, also:

TestClass-file: /test/TestClass.class
Aufruf: /
Aufruf mit: java test/TestClass

Bumm, und dann knallt es wieder mit 'ner NoClassDefFoundException: /test/TestClass (wrong name: TestClass. :frowning:

Und ich dachte mal, Java wäre einfach *seufz* Haste da vielleicht noch 'ne Idee, wie ich das machen könnte…?

Bis denne, und danke nochmals,

Bernd

import java.security.*;
import java.io.File;
import java.net.*;

public class TestClass
{
void printClassName()
{
Class klasse = this.getClass();
System.out.println("classname : " +
klasse.getName());
URL sourceURL =
klasse.getProtectionDomain().getCodeSource().getLocation();
System.out.println("URL: " + sourceURL);
try
{
URI sourceURI = new URI(sourceURL.toString());
File source = new File(sourceURI);
System.out.println("File : " +
source.getAbsolutePath());
}
catch (URISyntaxException e)
{}
}

public static void main(String[] args)
{
TestClass instanz = new TestClass();
instanz.printClassName();
}
}

Enjoy it.

Ben Janus

Hi,

also das erste Problem mit der URI kann man ja umgehen, indem
man die URL (von getLocation()) in einen String umwandelt,
und diesen dann dem File-Konstruktor mitgibt.
Falls dieser damit Probleme hat (wegen dem "file:/datei.java)
dann schneidet man den „file:“-Teil einfach ab.
Ich denke, dass müsste gehen (hab es aber nicht ausprobiert).

Das zweite Problem werde ich noch mal genauen untersuchen.

Ben

[…]dann schneidet man den „file:“-Teil einfach ab.
Ich denke, dass müsste gehen (hab es aber nicht ausprobiert).

Jap, genau so funktioniert das dann auch. Allerding nur als Stand-alone-Lösung mit java-Aufruf im gleichen Verzeichnis und nicht mit einem java-Aufruf aus anderen Verzeichnissen oder aus in einem Package.

Das zweite Problem werde ich noch mal genauen untersuchen.

Wäre und bin Dir sehr dankbar dafür!

Bis denne,

Bernd