当前位置: 首页 > 知识库问答 >
问题:

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

章高爽
2023-03-14

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

共有1个答案

厉永宁
2023-03-14

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

如果没有很少的黑客攻击(即访问ClassLoader类的私有字段),这似乎是不可能的

这个博客提供了两种方法。

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);
}
/**
* 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 10+] 没有一点黑客(即访问ClassLoader类的私有字段)似乎是不可能的 该博客提供了两种方法。 作为记录,这是简短版本。 选项1: 用新值完全替换

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

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

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

  • 根据在Java构建路径上找不到超类“javax.servlet.http.HttpServlet”,我完成了以下操作。项目属性->Java构建路径->添加库->从列表中选择“服务器运行时”->下一步->选择“Apache Tomcat”->完成 而且效果很好。但我不明白这个程序的用途。请告诉我为什么我们要将服务器运行时库添加到java构建路径中。

  • 问题内容: 我想在Tomcat中添加gdal库。我读了Tomcat中找不到的本机库,但不知道应该在哪里添加。 错误: 我从以下网址下载了gdal 64位:http ://vbkto.dyndns.org:1280/sdk/PackageList.aspx?file= release-1600-x64-gdal-1-9-mapserver-6-2.zip 问题答案: 必须在而不是startup.ba