windows - Flytter java app fra et tilfælde ufølsomt filsystem til en case sensitive

Indlæg af Hanne Mølgaard Plasc

Problem



Vi har kørt vores Java-kode på Windows-servere i årevis. Vi ønsker at køre den samme kode på nogle FreeBSD kasser, men vores kode er vokset op i et miljø, hvor fil/stienavn er så ufølsom så længe, ​​at meget af koden vil bryde.


Hvad jeg vil gøre er en slags trick, hvor vi underklasse File eller FileSystem eller noget lignende trick, og dette tvinger alle vores filnavne til små bogstaver (hele tiden).


Det virker temmelig muligt (dvs. udvide File med en ny klasse OurFile, der styrker alt små bogstaver). Så ville vi køre et script, der ændrer alle filer/mapper på OS små bogstaver og bam, bugs squashed.


Det lader til, at nogle lignende hacking med en ny FileSystem-implementering også ville give et godt resultat.


Jeg tænkte da - sikkert har nogen før mig stået over for dette problem og slikket det godt.


Så hvad er visdommen derude? Er der en nem/standard måde at løse denne type tilfælde følsomhed problem? (dvs. har nogen skrevet LowerCaseFileSystemForPortingWindowsToUnix udvider FileSystem og testet det etc.?)

Bedste reference


Har du overvejet at fastsætte din kode? Fra din beskrivelse synes du at have mange fil-/ressourcehenvisninger, som 'case-insensitive' (så simpelt talende, forkerte) navne i kode ... Det kan gøres enten ved at tilpasse filnavne til, hvordan de henvises til kode (kun når der er nogen konsekvens i kode, fg alle filnavne er små bogstaver) eller tilpasse konstanterne i kode for at matche filnavne.


Enhver wraps til java.io klasser ville kræve at liste alle filer/mapper overalt i stien og forsøge at finde navn, der ville matche stien. Men på U ** x-systemet kunne du have både resources og Resources mappen osv., Så hvilken ville du tage for stien 'RESSOURCER/BILDER/MYIMAGE.PNG'? Derudover vil du lide af ydeevne problemer for I/O operationer.


Jeg har en gang fastgjort et sådant projekt, fortunatelly det var ret lille, men det var meget irriterende. For held og lykke kunne nogle operationer skriptes, for eksempel at ændre alle konstanter i enkeltfil til små bogstaver og nedre kasse hele billedet filnavne osv.

Andre referencer 1


Hvis dine filadgangsmetoder går igennem et lille antal klasser (som new File(String filename)), kan du muligvis bruge AspectJ til at væve i en kode, der ændrer tilfældet med filnavnet, som det er sendt igennem.


Noget som:


@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() });
}


Dette ville sandsynligvis være meget mindre påtrængende på din kodebase end at udvide File, plus det ville give dig en exitstrategi:



  1. log.warn() alle filnavne gennemgik, som ikke er helt små bogstaver

  2. Ret advarslerne, når de opstår

  3. Fjern aspektet, når det er lagt i