Как я могу изменить текущий каталог программы - установив его в ярлык exe? - PullRequest
4 голосов
/ 29 ноября 2011

У меня есть исполняемый процесс, который выполняется с ярлыком.
В свойстве ярлыка «Начать с» я установил его в папку, где находятся все ресурсы приложения. Процесс по-прежнему ищет файлы в расположении исполняемого файла, а не в месте, указанном в ярлыке.

Я также могу видеть это в Process Explorer - «текущий каталог» - это местоположение exe.
Есть ли способ изменить это?

(Если бы я не был достаточно ясен - Я хочу поместить свое приложение в центральном сетевом расположении, а не в каждой папке пользователя - но я хочу, чтобы оно запускалось - над каждой папкой пользователя, поместив ярлык в каждую папку пользователя.)

Кстати: почему я не решаю это с помощью написания кода? Из-за сторонних банок у меня есть в exe (я использую exe4j, чтобы сделать exe)

Ответы [ 4 ]

5 голосов
/ 07 декабря 2011

Из документации exe4-j .. , похоже, это можно настроить в проекте exe4j.

Working directory
For some applications (especially GUI applications) you might want to change the working directory
to a specific directory relative to the executable, for example to read config files that are in a fixed
location. To do so, please select the Change working directory to: checkbox and enter a
directory relative to the executable in the adjacent text field. To change the current directory to the
same directory where the executable is located, please enter a single dot.
1 голос
/ 11 декабря 2011

Одной из альтернатив является использование системного свойства.Просто создайте ярлык следующим образом:

java -Dmyproperty="\\myserver\myfolder" -jar yourjar.jar

И получите это свойство в своей программе:

System.getProperty("myproperty");

Вы также можете установить несколько системных свойств.

0 голосов
/ 11 декабря 2011

Вы можете взломать classpath программно, что позволит вам указать конкретную папку или серию папок для доступа к данным.

import java.io.IOException;
import java.io.File;
import java.net.URLClassLoader;
import java.net.URL;
import java.lang.reflect.Method;

public class ClassPathHacker {

private static final Class[] parameters = new Class[]{URL.class};

public static void addFile(String s) throws IOException {
   File f = new File(s);
   addFile(f);
}//end method

public static void addFile(File f) throws IOException {
   addURL(f.toURI().toURL());
}//end method


public static void addURL(URL u) throws IOException {

  URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
  Class sysclass = URLClassLoader.class;

  try {
     Method method = sysclass.getDeclaredMethod("addURL", parameters);
     method.setAccessible(true);
     method.invoke(sysloader, new Object[]{u});
  } catch (Throwable t) {
     t.printStackTrace();
     throw new IOException("Error, could not add URL to system classloader");
  }//end try catch

   }//end method

}//end class

с файлом загрузчика свойств

<code>import java.io.InputStream;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;


public abstract class PropertyLoader
{
    /**
     * Looks up a resource named 'name' in the classpath. The resource must map
     * to a file with .properties extention. The name is assumed to be absolute
     * and can use either "/" or "." for package segment separation with an
     * optional leading "/" and optional ".properties" suffix. Thus, the
     * following names refer to the same resource:
     * <pre>
     * some.pkg.Resource
     * some.pkg.Resource.properties
     * some/pkg/Resource
     * some/pkg/Resource.properties
     * /some/pkg/Resource
     * /some/pkg/Resource.properties
     * 
* *@param name имя ресурса classpath [не может быть нулевым] * @param загрузчик классов загрузчика, через который загружается ресурс [null * эквивалентно загрузчику приложения] * * ресурс @return, преобразованный в java.util.Properties [может быть нулевым, еслиресурс * не был найден, а THROW_ON_LOAD_FAILURE имеет значение false] * @throws IllegalArgumentException, если ресурс не был найден и * THROW_ON_LOAD_FAILURE равен true * / public static Properties loadProperties (имя строки, загрузчик ClassLoader) {if (name == null) выбросить новый IllegalArgument(«нулевой ввод: имя»);if (name.startsWith ("/")) name = name.substring (1);if (name.endsWith (SUFFIX)) name = name.substring (0, name.length () - SUFFIX.length ());Свойства result = null;InputStream in = null;try {if (loader == null) loader = ClassLoader.getSystemClassLoader ();if (LOAD_AS_RESOURCE_BUNDLE) {name = name.replace ('/', '.');// Выдает исключение MissingResourceException при сбое поиска: final ResourceBundle rb = ResourceBundle.getBundle (name, Locale.getDefault (), loader);результат = новые свойства ();for (Enumeration keys = rb.getKeys (); keys.hasMoreElements ();) {final String key = (String) keys.nextElement ();final String value = rb.getString (key);result.put (ключ, значение);}} else {name = name.replace ('.', '/');if (! name.endsWith (SUFFIX)) name = name.concat (SUFFIX);// Возвращает ноль при ошибках поиска: in = loader.getResourceAsStream (name);if (in! = null) {result = new Properties ();result.load (in);// Может генерировать IOException}}} catch (Exception e) {result = null;} finally {if (in! = null) try {in.close ();} catch (Throwable ignore) {}} if (THROW_ON_LOAD_FAILURE && (result == null)) {throw new IllegalArgumentException ("не удалось загрузить [" + name + "]" + "как" + (LOAD_AS_RESOURCE_BUNDLE? "пакет ресурсов"): "ресурс загрузчика классов"));} вернуть результат;} / ** * Удобная перегрузка {@link #loadProperties (String, ClassLoader)} * *, которая использует загрузчик классов контекста текущего потока.* / public static Properties loadProperties (конечное имя строки) {return loadProperties (name, Thread.currentThread () .getContextClassLoader ());} private static final boolean THROW_ON_LOAD_FAILURE = true;приватный статический финальный логический LOAD_AS_RESOURCE_BUNDLE = false;private static final String SUFFIX = ".properties";} // Конец класса

, затем вы можете добавить путь следующим образом

 try {
            //First Load up the properties and populate the config
            ClassPathHacker.addFile("/pathtomyapp");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        properties = PropertyLoader.loadProperties("myapp");

или вы также можете использовать getResourceBundle для получения ваших ресурсов, это всего лишь один пример взломапуть к классу, чтобы позволить файлам быть доступными, вы всегда можете просто добавить путь к классу программно и позволить jar-файлам, которые вам нужны, находиться там, поэтому, если вы всегда убедитесь, что сетевой путь приложения равен Q: вы можете добавить Q: \в путь к классам.

0 голосов
/ 09 декабря 2011

Я бы запустил java-приложение с помощью файла cmd или bat, а затем переключился на рабочий каталог перед вызовом javaw. Если вы не делаете ничего особенного в своем коде Java-приложения, все пути в нем будут относительно места, где вы начали Java.

Jess

...