Java:寻找黑客来处理Linux中的Windows文件路径

Cha*_*ert 5 java coldfusion

假设您在Windows应用程序之上拥有基于Java的大型遗留ColdFusion.文件访问是通过java.io.File和CFFILE(后者也使用java.io.File)完成的,但不以任何方式集中到单个文件访问库中.此外,假设您在代码中以及数据库中都有硬编码的文件路径.

换句话说,假设文件路径本身不能改变.它们可以是本地或远程Windows文件路径:

  • C:\ TEMP\file.txt的
  • \\服务器\共享\ file.txt的

有没有办法在Linux上以最少的代码更改运行此应用程序?我正在寻找不涉及遗留代码的创造性解决方案.

一些想法:

  • 在WINE上运行它.这实际上是有效的,因为WINE将转换本地路径,并且具有用于远程路径的samba客户端.
  • 有没有办法覆盖java.io.File以使用自定义代码执行文件路径转换?在这种情况下,我会将远程路径转换为挂载点.

Osc*_*Ryz 6

有没有办法覆盖java.io.File以使用自定义代码执行文件路径转换?在这种情况下,我会将远程路径转换为挂载点

是的,您可以执行自己的实现java.io.File并将其放在一个单独的jar中,然后加载它而不是真实的java.io.File.

要让JVM加载它,您可以使用java启动器中的 java.endorsed.dirs属性或 java -Xbootclasspath/p:path选项(java)

但!!!

创建自己的java.io.File类版本并不像修改遗留源代码那么容易.

如果您害怕破坏某些东西,可以先提取所有硬编码路径以使用资源包:

所以:

 File file = new File("C:\\Users\\oreyes\\etc.txt");
Run Code Online (Sandbox Code Playgroud)

将会:

File file = new File( Paths.get( "user.dir.etc" ));
Run Code Online (Sandbox Code Playgroud)

并且Paths内部会有一个资源包

class Paths {
    private static ResourceBundle rs = ResourceBundle.getBundle("file.paths");
    public static String get( String key ) {
        rs.getString( key );
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用IDE(通常是国际化插件)提取所有这些硬编码路径

为Linux和您完成提供不同的资源包.测试并重新测试并重新测试

因此,使用java.io.File仅提供您自己的资源作为最后资源.