2017-07-10 5 views
0

私は3つの部分から構成されたプロジェクトがあります。異なるパッケージ:春+スパークアプリケーション

  • 春ブートアプリケーション
  • スパークアプリケーション
  • 「ライブラリ」上記の両方で使用します(このライブラリを別のJARまたはそれと同様のものにしておくと、オーバーヘッドが少なくなり、開発が遅くなる)

私が望むのは、Springブートアプリケーションを実行するために使用できるJARですr myapp.jar)とSparkアプリ(java -cp myapp.jar path.to.main.class)を使用します。 2つのJARを持つこともOKですが、どちらもfat JAR(意味:依存関係を含む)である必要があります。

私が試したのpom.xmlにすると、このです:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    </plugin> 

これは(予想通り)春ブートアプリケーションを実行するために使用することができます脂肪のJARを作成します。しかし、それはSparkアプリケーションには使用できません(クラスと依存関係は何らかの形で再パッケージ化されています)。 - しかし、依存関係のない

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <executions> 
     <execution> 
     <goals> 
      <goal>repackage</goal> 
     </goals> 
     <configuration> 
      <classifier>exec</classifier> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

これは、同様に脂肪のJARを作成し、プラス別のJARはちょうど私のプロジェクトで実装されたクラスを保持する:

私の2回目の試行では、このでした。したがって、Sparkジョブは(期待通りに)開始しません。

どのようにこのような状況を解決するためのアイデアですか?

ありがとうございます!

答えて

0

私は、アプリケーション用に同じテクノロジスタックを使用しました(WebパーツではSpring、大きなデータ処理ではApache Spark)。私は、誰かが、Spring + Sparkの両面でファットジャーを作ろうとしているケースを見ていません。ですから、私たちが使用するアプローチは、Mavenモジュール1をSpring WebパーツとApache Spark用に分けなければならないことです。我々は、すべての依存関係(例えば、より良いコントローラの使用を持っている

<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.5.0</version> 
      <configuration> 
       <mainClass>com.Application</mainClass> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.5.1</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <excludeArtifactIds>integration</excludeArtifactIds> 
         <outputDirectory>${project.build.directory}/lib/</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>com.Application</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

このように:春のブートのために我々は春・ブートのmaven-プラグインを使用していなかったが、代わりに、我々は次のMavenプラグインを使用し、このような何か:スパーク提出と

  • 実行(個人的に私はそれを好まない)
  • 使用:スパークアプリケーションの場合はlibフォルダに、その後入れて、MANIFESTに含める)

    次の2つのオプションがありますspark_lのSparkLauncherクラスauncher * .jar依存関係(ウェブからスパークジョブを呼び出す)。

スパークコードで使用されている依存関係のみを使用してSparkアプリケーション用のファインジャーを作成することが望ましく、本当に必要なものだけをロードする必要があります。これにはmaven-shade-pluginを使用することができます:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <artifactSet> 
          <includes> 
          // put here what you need to include 
          </includes> 
         </artifactSet> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
関連する問題