[英]Moving java app from a case insensitive file system to a case sensitive one
多年來,我們一直在Windows服務器上運行Java代碼。 我們想在某些FreeBSD機器上運行相同的代碼,但是我們的代碼在文件/路徑名不區分大小寫的環境中成長了很長時間,以至於很多代碼都會中斷。
我想要做的是某種技巧,其中我們將File或FileSystem子類化,或者類似的技巧,這會強制我們所有文件名始終使用小寫。
似乎很有可能(即用新的類OurFile擴展File,強制所有小寫)。 然后,我們將運行一個腳本,將操作系統上的所有文件/文件夾都轉換為小寫字母,並將bam和bug壓縮掉。
似乎使用新的FileSystem實現進行一些類似的黑客攻擊也會產生良好的結果。
然后我想-肯定是我之前有人遇到過這個問題,並很好地解決了這個問題。
那么,那里有什么智慧呢? 有沒有簡單/標准的方法來解決這種區分大小寫的問題? (即是否有人編寫了LowerCaseFileSystemForPortingWindowsToUnix擴展了FileSystem,並對其進行了測試等?)
您是否考慮過修改代碼? 從您的描述中,您似乎有很多文件/資源引用,它們在代碼中“不區分大小寫”(因此,簡單地說,是不正確的)名稱...可以通過調整文件名以使其在代碼中被引用來實現代碼(僅在代碼中有某些后果時,例如所有文件名均為小寫)或使代碼中的常量與文件名匹配。
對java.io類的任何環繞都需要在路徑中的任何位置列出所有文件/目錄,並嘗試查找與路徑匹配的名稱。 但是,在U ** x系統上,您可能同時擁有resources
和Resources
目錄等,那么對於路徑“ RESOURCES / IMAGES / MYIMAGE.PNG”,您應該選擇哪一個? 此外,您將遭受I / O操作的性能問題。
我曾經“修復”這樣的項目,所幸的是它很小,但是很煩人。 幸運的是,可以對某些操作進行腳本編寫,例如將單個文件中的所有常量更改為小寫,並將所有圖像文件名都使用小寫字母等。
如果您的文件訪問方法經過少量的類(例如new File(String filename)
),則您可以使用AspectJ編織一些代碼,該代碼修改文件名通過時的大小寫。
就像是:
@Around(value = "newFile(context)", argNames = "point")
public Object requiresNew(ProceedingJoinPoint point) throws Throwable {
String filename = (String) point.getArgs()[0];
return point.proceed(new String[] { filename.toLowerCase() });
}
與擴展File
,這對代碼庫的干擾可能要小得多,而且它還會為您提供退出策略:
log.warn()
傳遞的所有文件名都不是完全小寫的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.