为了账号安全,请及时绑定邮箱和手机立即绑定

类存在两次(在类路径和应用程序 jar 上)

类存在两次(在类路径和应用程序 jar 上)

宝慕林4294392 2023-08-09 17:29:32
启动 Java 应用程序时出现以下错误。我需要在启动应用程序之前将一些 hadoop 相关目录导出到类路径以使其工作(我无法跳过此步骤),并且出现以下错误。引起原因:java.lang.LinkageError:ClassCastException:尝试强制转换jar:文件:/usr/hdp/3.0.0.0-1634/hadoop/lib/jsr311-api-1.1.1.jar!/javax/ws/rs/ext /RuntimeDelegate.class 到 jar:file:/tmp/blobStore-634df1c1-ffc8-4610-86af-8f39b33e4250/job_ac11246bea2bb31008c1a78212357514/blob_p-79f2d3193313ea987c15b4b28411db0 fc2aa436c-f858cb54126b6d546c01e5ed453bf106!/javax/ws/rs/ext/RuntimeDelegate.class 位于 javax.ws.rs .ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:146) 在 javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120) 在 javax.ws.rs.core.UriBuilder.newInstance(UriBuilder.java:95) )在 javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119) 在 org.glassfish.jersey.client.JerseyWebTarget.(JerseyWebTarget.java:71) 在 org.glassfish.jersey.client.JerseyClient。目标(JerseyClient.java:290)在org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:76)在com.hortonworks.registries.schemaregistry.client.SchemaRegistryClient.lambda $ currentSchemaRegistryTargets $ 0(SchemaRegistryClient.java:293 )在java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)在com.hortonworks.registries.schemaregistry.client.SchemaRegistryClient.currentSchemaRegistryTargets(SchemaRegistryClient.java:293)在com.hortonworks.registries.schemaregistry.client。 SchemaRegistryClient.getSupportedSchemaProviders(SchemaRegistryClient.java:384) 在 com.hortonworks.registries.schemaregistry.client.SchemaRegistryClient.getDefaultDeserializer(SchemaRegistryClient.java:969) 在 SchemaService.InitDeserializer(SchemaService.java:47)在SchemaService.deserialize(SchemaService.java:38)在经过一些研究,我发现程序尝试使用的类存在于两个不同的 JAR 文件中:第一个是对我的 Maven 应用程序上的库的传递依赖 (javax.ws.rs.jar)第二个是位于目录中的一个 jar,其中包含来自 hortonworks 的所有 hadoop 依赖项,我需要将其导出到类路径中以使应用程序正常工作 (jsr311-api-1.1.1.jar)因此,我需要以某种方式告诉程序,应该使用打包在我的应用程序的 jar 中的 maven 依赖项,而不是位于类路径上的 jar。(javax.ws.rs.jar) 而不删除此 jar,因为它是一部分我的大数据集群安装,我无法使用类路径中的那些罐子。有什么想法吗?
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我使用这些版本将这些 jar 添加到类路径上。并构建并运行。我没有找到任何原因。


<!-- https://mvnrepository.com/artifact/com.hortonworks.registries/schema-registry-client -->

        <dependency>

            <groupId>com.hortonworks.registries</groupId>

            <artifactId>schema-registry-client</artifactId>

            <version>0.8.0</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/com.hortonworks.registries/schema-registry-serdes -->

        <dependency>

            <groupId>com.hortonworks.registries</groupId>

            <artifactId>schema-registry-serdes</artifactId>

            <version>0.8.0</version>

        </dependency>


        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->

        <dependency>

            <groupId>org.glassfish.jersey.core</groupId>

            <artifactId>jersey-client</artifactId>

            <version>2.29.1</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->

        <dependency>

            <groupId>javax.ws.rs</groupId>

            <artifactId>javax.ws.rs-api</artifactId>

            <version>2.1</version>

        </dependency>


查看完整回答
反对 回复 2023-08-09
?
弑天下

TA贡献1818条经验 获得超8个赞

如果类名与解决 LinkageError 相同,则可以像这样导入。


所以我们有两个同名但在不同包中的类


头等舱


package com.bbc.config;


public class Test1 {

 }

还有二等舱


package com.bbc.domain;


public class Test1 {

}

以及主要班级


package com.bbc.mainclass;

import com.bbc.config.Test1;


public class Main {

  public static void main(String[] args) {


  // this will import from config      

  Test1 test1 = new Test1(); // this will import from Test1


  // this will import from domain       

  com.bbc.domain.Test1 test11 = new com.bbc.domain.Test1();


  }

}


查看完整回答
反对 回复 2023-08-09
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信