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;
为了设置以下库,我执行了以下步骤:
我从https://search.maven.org/search?q=g:com.google.cloud%20AND%20a:google-cloud-bigquery&core=gav
下载神器google-cloud-bigquery最新版本
我从https://mvnrepository.com/artifact/com.google.cloud/google-cloud-core/1.94.0
下载神器google-cloud-core最新版本
我将这两个 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
从导航器选项卡中打开: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>
- 运行作业,不是编译错误而是运行时间错误:
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,那么也应该添加它们。
我想安装一些 Google Cloud Java 客户端库以在 tJava 组件中使用它(我不想使用 talend 的预构建组件)。
我正在尝试使用带有 tJava 组件的作业进行一些测试。这是我想要 运行:
的代码BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
在高级设置中我导入了以下库:
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
为了设置以下库,我执行了以下步骤:
我从https://search.maven.org/search?q=g:com.google.cloud%20AND%20a:google-cloud-bigquery&core=gav
下载神器google-cloud-bigquery最新版本我从https://mvnrepository.com/artifact/com.google.cloud/google-cloud-core/1.94.0
下载神器google-cloud-core最新版本我将这两个 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
从导航器选项卡中打开: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>
- 运行作业,不是编译错误而是运行时间错误:
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,那么也应该添加它们。