在tomcat Web应用程序中的类路径中动态添加属性文件

时间:2011-05-25 17:02:58

标签: java java-ee classpath

我正在尝试将属性文件动态添加到类路径中,如下所示

try {
    File fileToAdd = new File(FILE_PATH);
    URL u = fileToAdd.toURL();
    ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
    if (sysLoader instanceof URLClassLoader) {
    sysLoader = (URLClassLoader) sysLoader;
    Class<URLClassLoader> sysLoaderClass = URLClassLoader.class;

    // use reflection to invoke the private addURL method
    Method method = sysLoaderClass.getDeclaredMethod("addURL",
        new Class[] { URL.class });
    method.setAccessible(true);
    method.invoke(sysLoader, new Object[] { u });
    }
} catch (Exception e) {
    logger.error(e.getMessage());
}

但是我在类路径中看不到这个文件。当我使用

检查它
System.getProperty("java.class.path")

我无法在此列表中看到我的文件。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:4)

您无法添加属性文件的URL,您必须添加属性文件所在的目录的 URL。如:method.invoke(sysLoader, fileToAdd.getParent().toURL()); 然后你可以使用ClassLoader.getResourceAsStream("my.properties");,ClassLoader将在新添加的目录中搜索文件。

来自URLClassLoader

“此类加载器用于从引用 JAR文件和目录的URL的搜索路径加载类和资源。任何以”/“结尾的URL都假定为引用目录。否则,URL 假定引用JAR文件,将根据需要打开。“

答案 1 :(得分:1)

也许尝试这段代码,但是改变java.library.path或者保持它的方式,如果你可以使用库路径。



    /**
     * Allows you to add a path to the library path during runtime
     * @param dllLocation The path you would like to add
     * @return True if the operation completed successfully, false otherwise
     */
    public boolean addDllLocationToPath(final String dllLocation)
    {
        //our return value
        boolean retVal = false;
        try
        {
            System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + dllLocation);
            //get the sys path field
            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
            retVal = true;
        }
        catch (Exception e)
        {
            System.err.println("Could not modify path");
        }
        return retVal;
    }