2017-05-18 4 views
0

私が書いたGoogle Cloud Dataflowのためにクラウド上で統合テストを実行しています。 Pub/Subから読み込んでBigQueryに正しく書き込むことを確認しますが、Maven(mvn clean install)を使用すると、ステージングフォルダには必要なJARが設定されません。表示される唯一のJARはsurefirebooter.jarです。その結果、PipelineOptionsのNoClassDefFoundError(ほとんどの場合、参照しようとしている依存関係の最初のクラスであるため)がStackdriverログに記録され、テストが失敗します。それらはクラウド上で動作しているので、私は実際にDirectRunnerとは対照的にDataflowRunnerを使用しています。Mavenを使用しているときにGoogle Cloud上のステージングフォルダにJARを追加しない

IDEから統合テストを実行すると正常に動作します。ステージングフォルダにはすべてのJARが格納され、すべてが正常です。また、私はMavenを使ってテストを実行しますが、DirectRunnerを使用するとテストは正常に実行されます。したがって、MavenとDataflowRunnerを使用しているときにのみ問題が発生します。なぜこれが起こっている知っている

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>group</groupId> 
    <artifactId>artifact</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 


      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <appendAssemblyId>false</appendAssemblyId> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
         </manifest> 
        </archive> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.cloud.dataflow</groupId> 
      <artifactId>google-cloud-dataflow-java-sdk-all</artifactId> 
      <version>2.0.0-beta3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.25</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>1.7.25</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.junit.jupiter</groupId> 
      <artifactId>junit-jupiter-api</artifactId> 
      <version>5.0.0-M3</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>2.0.2-beta</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

誰でも、どのように私はそれを解決することがあります。私は、その問題は、したがって、私は下に与えているpom.xmlファイル、であると仮定しますか?

答えて

0

ファイルをステージングするとき、Dataflowランナーは自動的に現在のクラスローダーが使用できるクラスをステージングします。私は確信がテストを実行しやすくするためにクラスローダーといくつかのトリックを果たしていると私は信じています。

1つのオプションは、パイプラインオプションでfilesToStageを指定することです。これは、通常の「クラスローダーからステージングするJARを検出する」よりも優先されます。また、クラスパスを管理しているかの確実を見て、SDKのJARファイルは、テストが実行されているクラスローダで利用可能であることを確認します

+0

は、追加のように思える:。 ' org.apache.maven.plugins maven-確実な-プラグイン 2.20 <設定> ' は、問題を修正しましたが、これはint型になるかどうかはわかりません後でさらに問題を引き起こす。 – carpo

関連する問題