2017-04-20 42 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你是否因为建议替代你的方法而让我失望? –

相关问题