2013-10-10 21 views
2

我有一个需要外部罐子的maven应用程序。我能够建立我的应用程序很好。当我部署到Tomcat(通过IntelliJ),并运行我的应用程序时,我得到许多NoClassDefFound错误。为了解决这个问题,我不得不将我的.m2文件夹中缺少的jar文件复制到我的Tomcat lib目录中。Maven应用程序缺少运行时瓶罐

当我检查可部署应用程序中的爆炸性战争时,WEB-INF/lib目录中没有丢失的罐子。所以显然我的应用程序会抱怨。

我的问题是,我如何让我的maven在可展开的war文件中包含运行时jar?问题是,我有其他人在使用相同的POM在同一个应用上工作,没有人需要将缺少的jar复制到Tomcat。

  <dependency> 
      <groupId>xerces</groupId> 
      <artifactId>xercesImpl</artifactId> 
      <version>2.8.1</version> 
      <scope>provided</scope> 
     </dependency> 
+1

请分享pom文件或片段 –

+0

@TimofeiDavydik它相当大。你能更具体地了解你想要检查的部分吗?我可以粘贴这些。 – TheCoder

+0

我得到确切的问题。其他Maven项目工作正常。除了将jar添加到tomcat/lib目录之外,这里没有提供任何建议。我所有的依赖都在默认(编译)范围内,这应该使它们在运行时可用。我无法弄清楚。 –

回答

0

我把丢失的罐子到我的Tomcat库目录和Tomcat能够找到他们。这不是正确的做法,但它可以让我在短期内离开。我需要长期修复POM。

+0

你在这个线程中得到了这个提示! – user987339

0

检查,如果你有一个<scope>provided</scope>声明依赖性,或者他们是通过在test -scope事故。 Maven不会将这些依赖关系打包到warfile中。

如果不是经典的依赖关系,但追加到classpath中以另一种方式真正外部罐,即出内行达到,你可能想通过mvn install:install-file它们安装到你的本地库,让他们通过Maven的正确识别。

如果由于某种原因无法将jar安装到本地存储库中,另一个选项可能是system范围,您可以在其中指定jar的确切位置,但这不会将jar包装到warfile中,而是您必须确保所述罐子位于服务器上的所述位置。

由于其他人似乎没有问题(这会很奇怪),请检查您是否有任何本地修改,并重新检查其warfiles。如果你可以编译所有权利,但warfile不是其他人获得的文件,那么你的一方必须有一些东西。

更多关于示波器here

0

使用范围“运行时”而不是“提供”。

从Maven的文档:

“runtime-这个范围表明依赖不需要编译,但执行是在运行和测试类路径,而不是编译的类路径。”

所以你的情况应该是:

<dependency> 
    <groupId>xerces</groupId> 
    <artifactId>xercesImpl</artifactId> 
    <version>2.8.1</version> 
    <scope>runtime</scope> 
</dependency> 
+0

我得到这个错误:jaxb \ services \ XmlHolder.java:19:包org.apache.xml.serialize不存在。这是因为应用程序需要在编译以及运行时进行jar。 – TheCoder

+0

使用编译范围将jar添加到我部署的jar中,但是当我运行该应用程序时,仍然收到'java.lang.NoClassDefFoundError:org/apache/xml/serialize/OutputFormat'错误。 – TheCoder

+0

如果其他人的范围已经提供,并且他们的应用程序正在运行,那么我不确定是否需要更改POM。在说,他们可能会破解他们的配置。 – TheCoder

1

为了将来有这个问题的人:

我有完全一样的问题 - 在POM罐子不是在运行时可用,无论是在Java罐子构建路径。我能找到的唯一解决方法是将jar添加到tomcat/lib目录中。

发现我的Maven本地存储库已损坏 - 我不知道它有多少,但至少有一部分是。我将.m2/repository目录重新命名为oldrepository,再次尝试“干净安装”(需要一段时间才能再次下载所有jar),并且之后所有的工作都很完美。

希望这可以帮助别人。