【问题标题】:Incorrect class is getting referenced in the final war file在最终的战争文件中引用了不正确的类
【发布时间】:2017-05-10 18:54:23
【问题描述】:

我的项目有很多罐子。两个罐子有一个同名的特定类。这两个 jar 都包含一个名为 Response 的类。 jar A 中的 Response 类之一有一个方法 abc()。我在服务类中创建此类的引用并调用此方法 abc()。当我使用maven生成war文件并在与Eclipse集成的本地系统Tomcat中运行该项目时,找到该方法并且没有异常。但是当我在外部 AWS Tomcat 中部署相同的战争文件时,我得到了 java.lang.NoSuchMethodError。这一定是因为在war文件中,引用必须属于另一个jar中没有abc()方法的类。我无法删除这些类,因为它们都被使用了。 帮助。

【问题讨论】:

  • 这两个类的包结构是否相同?
  • 是的。包结构相同。另外,我检查了 Order 和 Export 但那 2 个罐子没有按顺序和导出列出。
  • 同一个包同一个类名根本不可能。或者更好的是,导入取决于类路径顺序,这只是一个非常糟糕的主意。您应该更改类名或更好的包,因为这听起来像是一个糟糕的设计选择......

标签: java maven tomcat jar


【解决方案1】:

如果您只想将 A 的类包含在您的 uber jar 中,我相信您可以通过在 yuor POM 文件中使用以下指令的内容,将 jar B 中的类排除在您的 uber jar 中: -

           <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>${hadoop.version}</version>
             <exclusions> 
               <exclusion> 
                <groupId>org.apache.commons</groupId> 
                <artifactId>commons-math3</artifactId> 
              </exclusion> 
            </exclusions> 
           </dependency>

上述指令将包含 hadoop 客户端核心 jar 中除 commons-math3 之外的所有依赖 jar,因此如果您想使用 apache commons-math3 的更新版本(或者说不同版本),您可以显式添加作为 POM 中的依赖项,而不必担心 hadoop 核心库中的 commons-math3 是否会包含在您的 uber jar 中

【讨论】:

  • 但我想包含来自不同 jar 的两个类。
  • 那么,如果我理解正确的话,你想访问两个具有相同名称和相同命名空间的类?
  • 是的。少数类使用 jar 1 中的类,少数类使用 jar 2 中的类
  • AFAIK 这是不可能的。如果 2 个类具有相同的名称和相同的命名空间,则它们不能同时存在于一个 jar 中。这就像在同一个目录下有 2 个具有相同名称和扩展名的文件
  • 它们存在于不同的罐子中,这两个罐子存在于一场战争中
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 2018-11-03
  • 2015-09-03
  • 2014-03-22
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多