java.lang.NoClassDefFoundError 在 Talend Studio 中

java.lang.NoClassDefFoundError in Talend Studio

我想安装一些 Google Cloud Java 客户端库以在 tJava 组件中使用它(我不想使用 talend 的预构建组件)。

我正在尝试使用带有 tJava 组件的作业进行一些测试。这是我想要 运行:

的代码
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService(); 

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

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

为了设置以下库,我执行了以下步骤:

  1. 我从https://search.maven.org/search?q=g:com.google.cloud%20AND%20a:google-cloud-bigquery&core=gav

    下载神器google-cloud-bigquery最新版本
  2. 我从https://mvnrepository.com/artifact/com.google.cloud/google-cloud-core/1.94.0

    下载神器google-cloud-core最新版本
  3. 我将这两个 jar 放在以下文件夹中:

    -...\TALEND STUDIO\configuration.m2\repository\com\google\cloud\google-cloud-bigquery.126.3\google-cloud-bigquery-1.126.3.jar

    -...\TALEND STUDIO\configuration.m2\repository\com\google\cloud\google-cloud-core.94.0\google-cloud-core-1.94.0

  4. 从导航器选项卡中打开:NAME_PROJECT/poms/pom.xml 并按如下方式添加依赖项:

使用底部的“添加”将 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>
  1. 运行作业,不是编译错误而是运行时间错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/cloud/bigquery/BigQueryOptions at bce_datahub.bigquery_template_0_1.bigquery_template.tJava_1Process(bigquery_template.java:331) at bce_datahub.bigquery_template_0_1.bigquery_template.runJobInTOS(bigquery_template.java:638) at bce_datahub.bigquery_template_0_1.bigquery_template.main(bigquery_template.java:464) Caused by: java.lang.ClassNotFoundException: com.google.cloud.bigquery.BigQueryOptions at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 3 more

我从这个线程Why am I getting a NoClassDefFoundError in Java?看到问题是由于在运行时间找不到class代码。我不知道如何将 class (jar) 放在 运行 时间路径中。

感谢您的帮助。

编辑:

不知道有没有用,我把pom.xml都放了。为了隐私,我隐藏了(用 xxx)它的一部分。我认为模块列表(talend 作业)没有用,所以我删除了该列表的一部分:

<?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>

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

  <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 负责将依赖项添加到您的编译路径和运行时路径。

maven仓库~/.m2/中加载了pom.xml文件中的依赖 (在你的例子中是 ...\TALEND STUDIO\configuration.m2\repository)。主要用于编译(使用编译范围)和执行测试(使用运行时范围)。

在执行 jar 时,Java 无法访问这些 jar,可能是因为它们不在类路径中 或不在同一目录中。

最简单的解决方案是将您添加的这两个新依赖 jar 放在应用程序 jar 所在的同一目录中,或者将这些 jar 的路径添加到 java.[=10= 的 PATH 环境变量中]

使用 java 可见的 jars 执行应用程序,这应该可以解决问题。

作业的 POM 文件是由工作室操作生成的,因此我会避免手动编辑它们。

还有其他方法可以实现这一点,首先我建议看一下 tLibraryLoad 组件以添加依赖 jar: https://help.talend.com/r/lw17672ujtsKAM3zY5H2oQ/wcAnfUMxgsm90CCS6~jiZw

如果您有超过 2-3 个 jar 文件,您还可以通过例程处理依赖项,然后将例程设置为作业的依赖项。 请记住,如果您的 SDK 有额外的依赖 jar,那么也应该添加它们。