JAR имя файла формы Java-код - PullRequest
3 голосов
/ 28 ноября 2010

Я хотел бы определить имя файла jar из моего кода java. Я нашел много решений в Google, но ничего не работает. Просто чтобы посмотреть, что я попробовал, это форум stackoverflow, на котором опубликовано множество решений: stackoverflow

У меня Mac OS X 10.6.5.
Когда я набираю java -version, я получаю такой результат:
java version "1.6.0_22"<br> Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)<br> Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

Спасибо за вашу помощь.


Edit: Я редактирую свой пост, чтобы ответить за комментарий.
Некоторые из решений дают мне «нулевое» значение, когда я хочу указать путь к System.out.println, а также не выполняются, когда я хочу создать экземпляр файла.
Другие решения, когда я спрашиваю путь, они не дают что-то вроде file:/....., вместо этого они дают что-то вроде rsch:/ или что-то вроде этого, я точно не знаю, но это простое слово из 4 символов.


Редактировать 2: Я запускаю исполняемый файл из консоли. И я хотел бы иметь это имя файла JAR в классах, которые находятся в исполняемом файле JAR.


Редактировать 3:
Слово из 4 символов: rsrc:./

Код, как я получил это:

    File file = null;
    try {
        System.out.println(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

Редактировать 4: Я также попробовал этот код:

package core;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class MyClass {

    public String getText(String key) {
        String path = "" + MyClass.class.getResource("../any.properties");
        File file = new File((path).substring(5, path.length()));

        Properties props = readProps(file);

        return props.getProperty(key);
    }

    private Properties readProps(File file) {
        Properties props = new Properties();
        InputStream in = null;

        try {
            in = new FileInputStream(file);
            props.load(in);
            in.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return props;
    }

    public static void main(String[] args) {
        System.out.println(new MyClass().getText("anything"));
    }

    }

С таким результатом:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1937)
at core.PropHandler.getText(MyClass.java:14)
at core.PropHandler.main(MyClass.java:39)
... 5 more

Этот код отлично работает в затмении, но когда я создаю исполняемый файл JAR, я думаю, что вы можете увидеть проблему.

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

Хорошо, наконец, вот код, который решил мою проблему:

String sConfigFile = "any.properties";

InputStream in = MyClass.class.getClassLoader().getResourceAsStream(sConfigFile);
if (in == null) {
    System.out.println("ugly error handling :D");
}
Properties props = new java.util.Properties();
try {
    props.load(in);
} catch (IOException e) {
    e.printStackTrace();
}

Таким образом он находит мой файл свойств.

1 голос
/ 28 ноября 2010

Это то, что вы хотите?http://www.uofr.net/~greg/java/get-resource-listing.html


jcomeau@intrepid:/tmp$ cat test.java; javac test.java; jar cvf test.jar test.class; java -cp test.jar test
public class test {
 public static void main(String[] args) {
  System.out.println(test.class.getResource("test.class"));
 }
}
adding: META-INF/ (in=0) (out=0) (stored 0%)
adding: META-INF/MANIFEST.MF (in=56) (out=56) (stored 0%)
adding: test.class (in=845) (out=515) (deflated 39%)
Total:
------
(in = 885) (out = 883) (deflated 0%)
jar:file:/tmp/test.jar!/test.class

Для доступа к ресурсам, работающим независимо от наличия файла JAR, я всегда использую classname.class.getResourceAsStream ().Но связанный документ показывает, как использовать JarFile () для той же цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...