当前位置: 首页 > 面试题库 >

在Java运行时为本机库添加新路径

欧君之
2023-03-14
问题内容

是否可以在运行时为本机库添加新路径?(而不是使用属性java.library.path启动Java),因此System.loadLibrary(nativeLibraryName)在尝试查找时,对的调用将包含该路径nativeLibraryName。这是可能的,还是在JVM启动后冻结了这些路径?


问题答案:

[此解决方案不适用于Java 10+]

没有一点黑客(即访问ClassLoader类的私有字段)似乎是不可能的

该博客提供了两种方法。

作为记录,这是简短版本。

选项1: 用新值完全替换java.library.path)

public static void setLibraryPath(String path) throws Exception {
    System.setProperty("java.library.path", path);

    //set sys_paths to null so that java.library.path will be reevalueted next time it is needed
    final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
    sysPathsField.setAccessible(true);
    sysPathsField.set(null, null);
}

选项2: 向当前java.library.path添加新路径

/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception{
    final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
    usrPathsField.setAccessible(true);

    //get array of paths
    final String[] paths = (String[])usrPathsField.get(null);

    //check if the path to add is already present
    for(String path : paths) {
        if(path.equals(pathToAdd)) {
            return;
        }
    }

    //add the new path
    final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
    newPaths[newPaths.length-1] = pathToAdd;
    usrPathsField.set(null, newPaths);
}


 类似资料:
  • 是否有可能在运行时为本机库添加新路径?。(而不是使用Java.library.path属性启动Java),因此在尝试查找时,调用将包含该路径。这是可能的,还是一旦JVM启动,这些路径就被冻结了?

  • 问题内容: 如何在Java运行时添加camel路线?我找到了Grails示例,但是已经用Java实现了。 我的applicationContext.xml已经有一些预定义的静态路由,我想在运行时为其添加一些动态路由。可能吗?因为包括动态路由的唯一方法是编写route.xml,然后将路由定义加载到上下文。它如何在现有静态路由上工作? 问题答案: 你可以在CamelContext上简单地调用一些不同的

  • 如何在Java的运行时添加骆驼路线?我找到了一个Grails示例,但我已经在Java实现了它。 我的应用程序上下文。xml已经有一些预定义的静态路由,我想在运行时向它添加一些动态路由。可能吗?因为包含动态路由的唯一方法是编写路由。然后将路由定义加载到上下文。它将如何在现有的静态路由上工作?运行时路由

  • 我有以下分布 主要的jar包含main方法,我想在其中访问lib提供的本机函数。所以被捆绑在发行版中。开始sh只需设置java的类路径和引导。 加载库的最佳方法是什么。那么应用程序内部的库呢?我知道两种方法: 系统。加载(绝对路径) 系统。loadLibrary(名称) 前者需要库在文件系统中的绝对路径,后者需要设置特定于应用程序的java。图书馆路径JVM参数。在这种情况下,哪种解决方案更好?将

  • 如何在文本运行时添加文本分隔符或转到下一行/行?我试着只做

  • 在java9之前,在运行时通过编程方式将外部jar添加到类路径中,每个人都使用: 现在使用java9我们遇到了问题: 在Java9中不再工作。在jdk9下,如何在运行时以编程方式向类路径添加外部jar?