从指定目录启动Java应用程序(main)

时间:2015-08-31 13:11:41

标签: java

我有一个非常大/旧/长时间运行的项目,它使用相对于启动目录的路径访问文件资源(即,只有从特定目录启动时,应用程序才会起作用)。当我需要调试程序时,我可以从eclipse启动它并使用Run Configurations-> - >工作目录设置启动目录。我希望能够编写一个将从指定目录启动主类的Java类。这是可能的,如果是这样我会怎么做?我找到了几个相关的项目,包括下面显示的那些,但似乎无法找到我正在寻找的答案。

https://community.oracle.com/thread/1257595?start=0&tstart=0

http://www.javapractices.com/topic/TopicAction.do?Id=243

How do I run a java program from a different directory?

Java - start another class' main in a different process

2 个答案:

答案 0 :(得分:1)

根据this,您可以编写一个带有main的简单类:

  1. 要求提供工作目录
  2. 在选择目录中复制您的jar
  3. 执行jar
  4. 从选择目录中删除jar。
  5. 实施例

    public class Exec
    {
       public static void main(String []args) throws Exception
        {   choosenDir=askForWorkingDirectory()
            jarFileNameWithabsolutePath=copyJarIntoDir(choosenDir)
            Process ps=Runtime.getRuntime().exec(new String[]{"java","-jar",jarFileNameWithabsolutePath});
            ps.waitFor();
            java.io.InputStream is=ps.getInputStream();
            byte b[]=new byte[is.available()];
            is.read(b,0,b.length);
            System.out.println(new String(b));
            deleteJarFormChoosenDir(jarFileNameWithabsolutePath);
        }
    }
    

    其中:

    askForWorkingDirectory()显示DirectoryChooser对话框并返回绝对路径。

    copyJarIntoDir(choosenDir)接收复制jar文件的选择目录,并返回带文件名的jar文件的绝对路径。

    deleteJarFormChoosenDir(jarFileNameWithabsolutePath)最后删除复制的jar

    希望我帮助过你!

答案 1 :(得分:0)

使用带有可选运行时目录参数的Runtime.getRuntime.exec为我工作。

这就是我使用的:

public static void main(String[] args) throws Exception {
    String classPath = getClassPath();
    Runtime.getRuntime().exec("java -cp " + classPath + " com.mycompany.MyApp", null, MY_WORKING_DIR);
}

private static String getClassPath() {
    StringBuffer buffer = new StringBuffer();
    URLClassLoader urlClassLoader = ((URLClassLoader) (Thread.currentThread().getContextClassLoader()));
    URL[] urls = urlClassLoader.getURLs();
    for (URL url : urls) {
        buffer.append(new File(url.getPath()));
        buffer.append(System.getProperty("path.separator"));
    }
    String rtn = buffer.toString();
    return rtn;
}