Chargement d'un fichier par rapport à l'exécution de fichier jar

La question, dit-il.

La spécialité dans mon cas, c'est que le répertoire de travail actuel n'est pas l'emplacement du fichier jar, mais c:\Windows\system32 (Mon fichier jar est lancé par windows à l'aide du clic droit menu, je veux passer un chemin d'accès au dossier en tant que paramètre à la jarre).

Maintenant je veux charger un fichier de configuration appelé config.xml qui est dans le même dossier que le pot. Le but de ce fichier est, bien sûr, de fournir des paramètres pour le pot. Il est important pour moi que le fichier xml est à l'extérieur du fichier jar pour l'édition facile.

Je vais avoir un moment difficile de charger ce fichier. Windows s'exécute la ligne

cmd /k java -jar D:\pathToJarfile\unpacker-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Appelant le tout avec cmd /k feuilles de l'invite de commande windows ouvrir afin que je puisse voir le pot de sortie.

Je ne peux pas utiliser new File(".") ou System.getProperty("user.dir") pour le chemin relatif de ces fonctions renvoient C:\Windows\system32\. et C:\Windows\system32, respectivement (qui est le dossier de travail pour tout ce que windows exécute autant que je sache).

Je n'ai eu aucun succès avec Launcher.class.getResourceAsStream("/../config.xml"). Depuis que le chemin commence par /, la recherche commence au nœud racine de la jarre. Va ../config.xml point exactement à ce fichier, mais les retours d'appel null.

Quelqu'un peut me pointer dans la bonne direction? Je suis vraiment coincé ici. Ce fichier de chargement des trucs vraiment m'énerve à chaque fois...

Exigences par moi-même:

  • Je ne veux pas coder en dur le chemin d'accès dans le code source java
  • Je ne veux pas passer le chemin d'accès du fichier comme paramètre à la java -jar appel (ni en tant que paramètre à la main(String[] args) ni l'utilisation de -Dpath=d:\... pour définir un système de propriété)

En plus le problème d'origine, j'ai eu beaucoup de mal à avoir maven2 place Class-Path: . dans le MANIFEST.MF (La solution que BalusC posté) lors de l'utilisation de jar-with-dependencies.
Le problème est que la ligne est apparu dans l'ordinaire de jar fichier de MANIFESTE, mais pas le jar-with-dependencies.jar'fichier MANIFEST (2 fichiers jar sont générées).
Pour quelqu'un qui se soucie de la façon dont je l'ai fait:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
      <archive>
        <manifest>
          <mainClass>${mainClass}</mainClass>
          <addClasspath>true</addClasspath>
          <!--at first, i tried to place the Class-Path entry
              right here using <manifestEntries>. see below -->
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>attached</goal>
        </goals>
        <phase>package</phase>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>${mainClass}</mainClass>
            </manifest>
            <!--this is the correct placement -->
            <manifestEntries>
              <Class-Path>.</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </execution>
    </executions>
  </plugin>

OriginalL'auteur f1sh | 2010-09-02