Warm tip: This article is reproduced from serverfault.com, please click

maven-Talend Studio中的java.lang.NoClassDefFoundError

(maven - java.lang.NoClassDefFoundError in Talend Studio)

发布于 2020-12-19 13:05:39

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

我正在尝试对带有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. 我将这两个罐子放在以下文件夹中:

    -... \ 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

  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. 运行作业,不会发生编译错误,但是会发生运行时错误:

线程“主”中的异常java.lang.NoClassDefFoundError:com / google / cloud / bigquery / BigQueryOptions位于bce_datahub.bigquery_template_0_1.bigquery_template.tJava_1Process(bigquery_template.java:331)位于bce_datahub.bigquery_template_0_1.bigquery_template.runJobInTOS(:bigquery_template) ),位于bce_datahub.bigquery_template_0_1.bigquery_template.main(bigquery_template.java:464)的原因:java.lang.ClassNotFoundException:java.net.URLClassLoader.findClass(URLClassLoader.java:382)上的com.google.cloud.bigquery.BigQueryOptions。在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:349)处的java.lang.ClassLoader.loadClass(ClassLoader.java:424)在java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 3更多的

我从该线程中看到了为什么我会在Java中收到NoClassDefFoundError?该问题是由于在运行时找不到类代码这一事实造成的。我不知道如何将类(罐子)放在运行时路径中。

感谢你的帮助。

编辑:

我不知道它是否有用,但我放置了所有pom.xml。为了保密起见,我将其一部分隐藏(带有xxx)。我认为模块列表(人才工作)没有用,因此我删除了该列表的一部分:

<?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>
Questioner
Simone Giusso
Viewed
0
Balazs Gunics 2020-12-28 20:20:01

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

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

如果你有超过2-3个jar文件,则还可以通过例程处理依赖关系,然后将例程设置为作业的依赖关系。请记住,如果你的SDK包含其他依赖项jar,则也应添加这些依赖项。