2017-04-20 19 views
2

標記之前,請閱讀整篇文章!如何在Tomcat webapp中加載作爲Maven依賴關係添加的jar中的所有文件?

我要讀的jar這是一個Maven的依賴性profiles文件夾下的所有文件:

jar structure

下面是我使用的讀取文件的代碼:

CodeSource cs = Detector.class.getProtectionDomain().getCodeSource(); 
public List<String> pr = new ArrayList<>(); 
if (cs != null) { 
    URL jar = cs.getLocation(); 
    ZipInputStream zip = null; 
    try { 
     zip = new ZipInputStream(jar.openStream()); 
     while (true) { 
      ZipEntry entry = zip.getNextEntry(); 
      if (entry == null) 
       break; 
      String ename = entry.getName(); 
      if (ename.startsWith("profiles/")) { 
       try(InputStream in = 
         Detector.class.getClassLoader().getResourceAsStream(ename)) { 
        pr.add(IOUtils.toString(in)); 
       } 
      } 
     } 
     DetectorFactory.loadProfile(pr); 
    } 
} 

當我在獨立的Java項目中使用此代碼時,它工作正常並且正在讀取文件,但是當我在Tomcat webapp中使用相同的代碼時,它不會。然而根據我的觀察,這似乎是Tomcat的ClassLoader問題,因爲在Java應用程序中,類加載器是LauncherAppClassLoader,而在webapp中它是ParallelWebAppClassLoader

+0

這個'langdetect -.... jar'是在你的控制下還是在你認識的人的控制之下? –

+0

我已經添加它作爲Maven的依賴 – amit28

+0

我知道。你之前這麼說。但是您也可以將您自己的(公司的)工件添加爲Maven依賴項。他們不一定非得從外部來。但我認爲[這是你的情況](http://search.maven.org/#search%7Cga%7C1%7Clangdetect),對不對?順便說一句,在Maven Central有一個更新的版本('1.1.2-20151117'),擴展了'groupId'。這是[GitHub上的一個項目](https://github.com/shuyo/language-detection)。只要許可證允許,你爲什麼不簡單地將其分成任何你想做的事情。 –

回答

-1

我會怎麼做:

  1. 在生成過程中,解開langdetect罐子dependency:unpack
  2. 將相關目錄添加到項目的資源中。
  3. 在運行期間將它們用作任何其他資源。

這節省了您在運行時解壓縮jar的麻煩,尤其是找到那個jar。

+0

好吧,這似乎是第二種方法,如果你能爲現有代碼提出解決方案,我將不勝感激。由於它爲獨立的java工作,它也應該在tomcat webapp中工作。 – amit28

+0

在運行時解壓依賴是一件不尋常的事情,我不希望它在任何地方都能正常工作。我試圖爲你的問題描述一個更類似Maven的方法。 –

+0

@ amit28你是否因爲建議替代你的方法而讓我失望? –

相關問題