簡體   English   中英

將Java應用程序從不區分大小寫的文件系統移動到區分大小寫的文件系統

[英]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系統上,您可能同時擁有resourcesResources目錄等,那么對於路徑“ 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 ,這對代碼庫的干擾可能要小得多,而且它還會為您提供退出策略:

  1. log.warn()傳遞的所有文件名都不是完全小寫的
  2. 修正出現的警告
  3. 嵌入外觀后將其移除

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM