Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java在linux中驻留jar文件的目录的物理位置_Java_Linux - Fatal编程技术网

使用java在linux中驻留jar文件的目录的物理位置

使用java在linux中驻留jar文件的目录的物理位置,java,linux,Java,Linux,jar文件位于Linux文件系统目录中 /home/user/hello.jar 每当运行hello.jar时,我得到的是运行时环境路径,而不是jar所在的物理路径,需要得到jar的物理位置,即 /home/user 我该怎么做呢?我认为没有一种非常可靠的方法可以做到这一点。我能想到的最好的方法就是解析类路径并从那里开始工作。下面是获取类路径元素的方法: ClassLoader classLoader = ClassLoader.getSystemClassLoader();

jar文件位于Linux文件系统目录中

/home/user/hello.jar
每当运行hello.jar时,我得到的是运行时环境路径,而不是jar所在的物理路径,需要得到jar的物理位置,即

/home/user

我该怎么做呢?

我认为没有一种非常可靠的方法可以做到这一点。我能想到的最好的方法就是解析类路径并从那里开始工作。下面是获取类路径元素的方法:

    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    URL[] urls = ((URLClassLoader) classLoader).getURLs();
此代码假定我们使用的是默认的系统类加载器。

请尝试以下操作:

URL location = MyClassInJar.class.getResource('/' + MyClassInJar.class.getName().replace('.', '/') + ".class");
String s = location.toString();
这段代码返回jar文件的路径和jar中类的路径。 比如说

jar:file:/Oracle/Middleware/Oracle\u Home/Oracle\u common/modules/com.sun.xml.ws.jaxws-rt\u 2.2.jar/com/sun/xml/ws/api/message/MyClassInJar.class

因此,您可以修剪类名(完整限定名)

假设
mainClass
是jar文件中的
java.lang.Class
,则应该这样做

编辑:

完成主要课程:

import java.io.File;

public class App
{
    public static void main( String[] args ) throws Exception
    {
        Class<App> mainClass = App.class;
        File f= new File( mainClass.getProtectionDomain()
                           .getCodeSource()
                           .getLocation().toURI() );
        System.out.println(f);
    }
}
导入java.io.File;
公共类应用程序
{
公共静态void main(字符串[]args)引发异常
{
Class main Class=App.Class;
文件f=新文件(mainClass.getProtectionDomain()
.getCodeSource()
.getLocation().toURI());
系统输出打印ln(f);
}
}

我使用以下代码获取类的位置:
URL location=msg.getClass().getResource('/'+msg.getClass().getName().replace('.','/')+“.class”)位置包含jar的完整路径和jar中类的路径。它适用于windows,不适用于Linux。我得到的是运行时执行路径,而不是Jarn的物理位置。为什么需要它?如果您需要jar中的资源,只需执行
MainClassName.getClass().getResourceAsStream(“/path/in/jar/to/file”)
,这样一来,jar的位置就不重要了。要始终确保jar位于何处,请创建一个安装程序,并为外部资源创建一个安装文件夹。像
AppData/somefolder/.applicationname
和unix flavor
$home/.applicationname
下,您尝试过@RC。我想这不是复制品。当前工作目录和jar所在的目录之间存在差异。我没有获取物理locn/home/user,运行上面的代码后,我得到的是/usr/hdp/2.2.0.0-2041/hadoop/conf:/usr/hdp/2.2.0.0-2041/hadoop/lib/jars这个想法是找到与jar对应的URL并从中提取路径。上面的代码中的消息是什么?获取错误getProtectionDomain()是未定义的。我添加了一个更完整的示例
import java.io.File;

public class App
{
    public static void main( String[] args ) throws Exception
    {
        Class<App> mainClass = App.class;
        File f= new File( mainClass.getProtectionDomain()
                           .getCodeSource()
                           .getLocation().toURI() );
        System.out.println(f);
    }
}