我想安装一些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>
3条答案
按热度按时间5ssjco0h1#
您应该在pom.xml中进行适当的定义(使用
pom.xml
选项卡来编辑文本)。另见maven文档。maven负责将依赖项添加到编译路径和运行时路径中。
pxiryf3j2#
作业的pom文件是由studio操作生成的,因此我避免手动编辑它们。
有其他方法可以实现这一点,首先我建议看一下tlibraryload组件以添加依赖jar:https://help.talend.com/r/lw17672ujtskam3zy5h2oq/wcanfumxgsm90ccs6~jizw
如果您有2-3个以上的jar文件,还可以通过例程处理依赖关系,然后将例程设置为作业的依赖关系。请记住,如果您的sdk有额外的依赖jar,那么也应该添加这些jar。
pxq42qpu3#
pom.xml文件中的依赖项加载到maven repository~/.m2/(在您的示例中是…\talend studio\configuration.m2\repository)。主要用于编译(具有编译范围)和执行测试(具有运行时范围)。
在执行jar时,java无法访问这些jar,可能是因为这些jar不在类路径或同一目录中。
最简单的解决方案是将添加的这两个新的依赖关系jar放在应用程序jar所在的同一目录中,或者将这些jar的路径添加到java的path环境变量中。
使用java可见的jar执行应用程序,这应该可以解决问题。