java.lang.noclassdeffounderror

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

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

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

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

import com.google.cloud.bigquery.BigQuery;
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更改如下:

...
  <dependencies>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-bigquery</artifactId>
        <version>1.126.3</version>
    </dependency>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-core</artifactId>
        <version>1.94.0</version>
    </dependency>
  </dependencies>
</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)没有用,所以我删除了该列表的一部分:

<?xml version="1.0"?>
<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"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example.xxx</groupId>
  <artifactId>code.Master</artifactId>
  <version>7.0.1</version>
  <packaging>pom</packaging>
  <name>xxx Codes Master</name>
  <url>http://www.talend.org/</url>
  <modules>
    <module>code/routines</module>
    <module>jobs/process/xxx</module>
    <module>jobs/process/xxx/xxx/xxx</module>
    <module>...</module>
    <module>jobs/process/xxx/xxx/xxx</module>
    <module>../../REFERENCE/poms</module>
    <module>jobs/process/xxx</module>
  </modules>
  <properties>
    <talend.project.name>xxx</talend.project.name>
    <encoding>UTF-8</encoding>
  </properties>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.6.1</version>
          <dependencies>
            <dependency>
              <groupId>org.eclipse.tycho</groupId>
              <artifactId>tycho-compiler-jdt</artifactId>
              <version>1.0.0</version>
            </dependency>
          </dependencies>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <compilerId>jdt</compilerId>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
          <configuration>
            <archive>
              <addMavenDescriptor>false</addMavenDescriptor>
            </archive>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <profiles>
    <profile>
      <id>ci-builder</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.talend</groupId>
            <artifactId>ci.builder</artifactId>
            <version>7.0.1</version>
            <executions>
              <execution>
                <phase>generate-sources</phase>
                <goals>
                  <goal>generate</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  <dependencies>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-bigquery</artifactId>
        <version>1.126.3</version>
    </dependency>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-core</artifactId>
        <version>1.94.0</version>
    </dependency>
  </dependencies>
</project>
5ssjco0h

5ssjco0h1#

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

<dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-bigquery</artifactId>
      <version>1.126.3</version>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-core</artifactId>
      <version>1.94.0</version>
    </dependency>
    <!-- other dependencies -->
  </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执行应用程序,这应该可以解决问题。

相关问题