java.lang.noclassdeffounderror

s2j5cfk0  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(623)

我想安装一些googlecloudjava客户端库,以便在tjava组件中使用它(我不想使用talend的预构建组件)。
我正在用tjava组件测试一个作业。这是我要运行的代码:

  1. BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

在高级设置中,我导入以下库:

  1. import com.google.cloud.bigquery.BigQuery;
  2. import com.google.cloud.bigquery.BigQueryOptions;

要设置以下库,我执行了以下步骤:
我从google cloud bigquery下载了工件的最新版本https://search.maven.org/search?q=g:com.google.cloud%20and%20a:google cloud bigquery&core=gav
我从googlecloudcore下载了工件的最新版本https://mvnrepository.com/artifact/com.google.cloud/google-cloud-core/1.94.0
我把这两个jar放在下面的文件夹里:
-…\talend studio\configuration.m2\repository\com\google\cloud\google cloud bigquery\1.126.3\google-cloud-bigquery-1.126.3.jar
-…\talend studio\configuration.m2\repository\com\google\cloud\google cloud core\1.94.0\google-cloud-core-1.94.0
在navigator选项卡中,我打开了:name\u project/poms/pom.xml,并添加了如下依赖项:

使用底部的“add”将pom.xml更改如下:

  1. ...
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.google.cloud</groupId>
  5. <artifactId>google-cloud-bigquery</artifactId>
  6. <version>1.126.3</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>com.google.cloud</groupId>
  10. <artifactId>google-cloud-core</artifactId>
  11. <version>1.94.0</version>
  12. </dependency>
  13. </dependencies>
  14. </project>

运行作业时,出现的不是编译错误,而是运行时错误:
线程“main”java.lang.noclassdeffounderror中出现异常:com/google/cloud/bigquery/bigqueryoptions位于bce\u datahub.bigquery\u template\u 0\u 1.bigquery\u template.tjava\u 1process(bigquery\u template)。java:331)在bce\u datahub.bigquery\u template\u 0\u 1.bigquery\u template.runjobintos(bigquery\u template)。java:638)在bce\u datahub.bigquery\u template\u 0\u 1.bigquery\u template.main(bigquery\u template。java:464)原因:java.lang.classnotfoundexception:com.google.cloud.bigquery.bigqueryoptions位于java.net.urlclassloader.findclass(urlclassloader)。java:382)在java.lang.classloader.loadclass(classloader。java:424)在sun.misc.launcher$appclassloader.loadclass(launcher。java:349)在java.lang.classloader.loadclass(classloader。java:357) ... 3个以上
我从这个线程中看到了为什么在java中会出现noclassdeffounderror?问题是由于在运行时找不到类代码。我不知道如何将类(jar)放入运行时路径。
谢谢你的帮助。
编辑:
我不知道它是否有用,但我把所有的pom.xml。为了隐私,我(和)藏了一部分。我认为模块列表(talend jobs)没有用,所以我删除了该列表的一部分:

  1. <?xml version="1.0"?>
  2. <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>org.example.xxx</groupId>
  6. <artifactId>code.Master</artifactId>
  7. <version>7.0.1</version>
  8. <packaging>pom</packaging>
  9. <name>xxx Codes Master</name>
  10. <url>http://www.talend.org/</url>
  11. <modules>
  12. <module>code/routines</module>
  13. <module>jobs/process/xxx</module>
  14. <module>jobs/process/xxx/xxx/xxx</module>
  15. <module>...</module>
  16. <module>jobs/process/xxx/xxx/xxx</module>
  17. <module>../../REFERENCE/poms</module>
  18. <module>jobs/process/xxx</module>
  19. </modules>
  20. <properties>
  21. <talend.project.name>xxx</talend.project.name>
  22. <encoding>UTF-8</encoding>
  23. </properties>
  24. <build>
  25. <pluginManagement>
  26. <plugins>
  27. <plugin>
  28. <artifactId>maven-clean-plugin</artifactId>
  29. <version>3.0.0</version>
  30. </plugin>
  31. <plugin>
  32. <artifactId>maven-compiler-plugin</artifactId>
  33. <version>3.6.1</version>
  34. <dependencies>
  35. <dependency>
  36. <groupId>org.eclipse.tycho</groupId>
  37. <artifactId>tycho-compiler-jdt</artifactId>
  38. <version>1.0.0</version>
  39. </dependency>
  40. </dependencies>
  41. <configuration>
  42. <source>1.8</source>
  43. <target>1.8</target>
  44. <compilerId>jdt</compilerId>
  45. </configuration>
  46. </plugin>
  47. <plugin>
  48. <artifactId>maven-resources-plugin</artifactId>
  49. <version>3.0.2</version>
  50. </plugin>
  51. <plugin>
  52. <artifactId>maven-jar-plugin</artifactId>
  53. <version>3.0.2</version>
  54. <configuration>
  55. <archive>
  56. <addMavenDescriptor>false</addMavenDescriptor>
  57. </archive>
  58. </configuration>
  59. </plugin>
  60. <plugin>
  61. <artifactId>maven-assembly-plugin</artifactId>
  62. <version>3.0.0</version>
  63. </plugin>
  64. <plugin>
  65. <artifactId>maven-surefire-plugin</artifactId>
  66. <version>2.20</version>
  67. </plugin>
  68. </plugins>
  69. </pluginManagement>
  70. </build>
  71. <profiles>
  72. <profile>
  73. <id>ci-builder</id>
  74. <activation>
  75. <activeByDefault>true</activeByDefault>
  76. </activation>
  77. <build>
  78. <plugins>
  79. <plugin>
  80. <groupId>org.talend</groupId>
  81. <artifactId>ci.builder</artifactId>
  82. <version>7.0.1</version>
  83. <executions>
  84. <execution>
  85. <phase>generate-sources</phase>
  86. <goals>
  87. <goal>generate</goal>
  88. </goals>
  89. </execution>
  90. </executions>
  91. </plugin>
  92. </plugins>
  93. </build>
  94. </profile>
  95. </profiles>
  96. <dependencies>
  97. <dependency>
  98. <groupId>com.google.cloud</groupId>
  99. <artifactId>google-cloud-bigquery</artifactId>
  100. <version>1.126.3</version>
  101. </dependency>
  102. <dependency>
  103. <groupId>com.google.cloud</groupId>
  104. <artifactId>google-cloud-core</artifactId>
  105. <version>1.94.0</version>
  106. </dependency>
  107. </dependencies>
  108. </project>
5ssjco0h

5ssjco0h1#

您应该在pom.xml中进行适当的定义(使用 pom.xml 选项卡来编辑文本)。另见maven文档。

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.google.cloud</groupId>
  4. <artifactId>google-cloud-bigquery</artifactId>
  5. <version>1.126.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.google.cloud</groupId>
  9. <artifactId>google-cloud-core</artifactId>
  10. <version>1.94.0</version>
  11. </dependency>
  12. <!-- other dependencies -->
  13. </dependencies>

maven负责将依赖项添加到编译路径和运行时路径中。

pxiryf3j

pxiryf3j2#

作业的pom文件是由studio操作生成的,因此我避免手动编辑它们。
有其他方法可以实现这一点,首先我建议看一下tlibraryload组件以添加依赖jar:https://help.talend.com/r/lw17672ujtskam3zy5h2oq/wcanfumxgsm90ccs6~jizw
如果您有2-3个以上的jar文件,还可以通过例程处理依赖关系,然后将例程设置为作业的依赖关系。请记住,如果您的sdk有额外的依赖jar,那么也应该添加这些jar。

pxq42qpu

pxq42qpu3#

pom.xml文件中的依赖项加载到maven repository~/.m2/(在您的示例中是…\talend studio\configuration.m2\repository)。主要用于编译(具有编译范围)和执行测试(具有运行时范围)。
在执行jar时,java无法访问这些jar,可能是因为这些jar不在类路径或同一目录中。
最简单的解决方案是将添加的这两个新的依赖关系jar放在应用程序jar所在的同一目录中,或者将这些jar的路径添加到java的path环境变量中。
使用java可见的jar执行应用程序,这应该可以解决问题。

相关问题