2017-06-03 12 views
0

Linux(openSUSE)マシンでは、Unicode文字の名前を持つファイルを含むTomcat 8アプリケーション(warファイル)にデプロイしようとしています。Tomcat 8 Unicodeファイル名warファイルのデプロイメント

warファイルの内部名は、次のようになります。

бжк-природний-1496336830201.xml 

が、後のファイルは次のようになり展開:

正しくファイル名を展開するためにTomcatを伝える方法
???-?????????????-1496336830201.xml 

UPDATED

これは、内部のUnicodeのファイル名を持つサンプルwarファイルです:この戦争で内部ファイルのファイル名と間違っているwar file

何?それはここhttps://superuser.com/questions/1215670/opensuse-unzip-unicode-issue、今示唆されたように私は、WARファイルに(コンソールコマンド)を解凍しunzip-rccをインストールしている

UPDATED

が正常に動作しているが、Tomcatはまだ同じ問題を使用してファイルを展開します。

+0

、特殊文字を含むファイル名が保存されていますか?もう一つは、JAVAが正しいエンコーディングを持つようにすることです。 –

+0

yeah .. unzipがファイル名を打ち消す – alexanoid

+0

これは、オペレーティングシステムに、そのようなエンコードを処理するフォントまたは文字セットがないことを示しています。だからJavaの障害:) –

答えて

2

は、Tomcatの起動スクリプトでこれらの設定を入れてみてください:

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 

経験から、Javaはそれをエンコードする方法を知らない文字のためのアップサイドダウン疑問符を表示します。

+0

ありがとう!私はこの問題を数日間苦労していましたが、今あなたの助けを借りて解決されています!これらのプロパティをtomcat.confファイルに追加しました – alexanoid

2

ファイル名は実際にはzip .warファイルのUTF-8です。ジッパーは(bytes[] extra情報として)符号化が追加されていないが

try (ZipFile zipFile = new ZipFile(path, StandardCharsets.UTF_8)) { 
    zipFile.stream() 
     .forEachOrdered(entry -> System.out.printf("- %s%n", entry.getName())); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

三つのソリューションは想像のようになります。

  • 一つの短いソリューションは、UTF-8ロケールでTomcatを実行するかもしれません。
  • 最高ののは、MavenにUTF-8エンコーディングの戦争を構築させることです。 (<onfiguration><encoding>UTF-8</encoding></configuration>
  • 変換することによって戦争を修復する。

最初の2つのソリューションでは、私は経験がありません。クイック検索では何も得られませんでした(「エンコーディング」は少しばかりです)。

修理のコードは単純です:あなたがディレクトリに戦争を解凍した場合

Path path = Paths.get(".../api.war").toAbsolutePath().normalize(); 
Path path2 = Paths.get(".../api2.war").toAbsolutePath().normalize(); 

URI uri = URI.create("jar:file://" + path.toString()); 
Map<String,String> env = new HashMap<String,String>(); 
env.put("create", "false"); 
env.put("encoding", "UTF-8"); 

URI uri2 = URI.create("jar:file://" + path2.toString()); 
Map<String,String> env2 = new HashMap<String,String>(); 
env2.put("create", "true"); 
env2.put("encoding", "UTF-8"); 

try (FileSystem zipFS = FileSystems.newFileSystem(uri, env); 
    FileSystem zipFS2 = FileSystems.newFileSystem(uri2, env2)) { 

    Files.walkFileTree(zipFS.getPath("/"), new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
        throws IOException { 
      System.out.println("* File: " + file); 
      Path file2 = zipFS2.getPath(file.toString()); 
      Files.createDirectories(file2.getParent()); 
      Files.copy(file, file2); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 

} catch(IOException e) { 
    e.printStackTrace(); 
} 
関連する問題