假设您在Windows应用程序之上拥有基于Java的大型遗留ColdFusion。文件访问是通过java.io.File和CFFILE(后者也使用java.io.File)完成的,但不以任何方式集中到单个文件访问库中。此外,假设您在代码中以及数据库中都有硬编码的文件路径。
换句话说,假设文件路径本身不能改变。它们可以是本地或远程Windows文件路径:
有没有办法在Linux上以最少的代码更改运行此应用程序?我正在寻找不涉及遗留代码的创意解决方案。
一些想法:
答案 0 :(得分: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");
将是:
File file = new File( Paths.get( "user.dir.etc" ));
Paths
内部有资源包
class Paths {
private static ResourceBundle rs = ResourceBundle.getBundle("file.paths");
public static String get( String key ) {
rs.getString( key );
}
}
您可以使用IDE(通常是国际化插件)提取所有这些硬编码路径
为Linux提供不同的资源包并完成。测试并重新测试并重新测试
因此,使用仅提供您自己的java.io.File
作为最后一个资源。
答案 1 :(得分:2)
java.io.File
不是最终类,可以扩展。在您的扩展中,您可以拥有一个(或更多)构造函数来转换文件路径。这只需要你编写翻译器,并将File的每个初始化更改为扩展类。
由于您的课程将扩展java.io.File
,因此除了更改初始化之外,不需要进行其他代码更改。
java.io.File file1 = new ClassThatExtendsFile("C:\temp\file.txt");
[edit]:或者你可以扩展CFFILE,并覆盖它的构造函数。