JAR ファイル をビルドします

このトピックでは、データ クライアント ライブラリおよびすべての依存関係( fat-jar )を含む JAR ファイル を作成する方法について説明します。 結果として作成された JAR ファイル は、パイプラインまたは独自のアプリケーションで使用できます。

データ クライアント ライブラリでは、各モジュール /JAR に reference.conf ファイルが必要です。これらのファイルはすべて個別にロードされます。 複数の JAR ファイルを 1 つの JAR ファイル に結合する場合は、すべて reference.conf のファイルを結合する必要もあります。 この設定を行わないと、既定値はロードされず、プロジェクトの動作が停止します。

Maven を使用してアプリケーションをパッケージ化する場合は 、プラグインのリソース変換ツールに対する Shade Apache サポートを使用し て 、構築クラスパス上のすべてのreference.confファイルを 1 つのファイルにマージすることもでき ます。sbtにも同様のプラグインがあります。

次のプラグイン設定を使用します。

SBT
Maven
// sbt plugin
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "<latest-version>")

// sbt project
project.in(file("examples-project"))
  .settings(
    mainClass in assembly := Some("project.Main"),
    assemblyMergeStrategy in assembly := { defaultMergeStrategy },
  )

// merge strategy
val defaultMergeStrategy: String => MergeStrategy = {
  case x if Assembly.isConfigFile(x) =>
    MergeStrategy.concat
  case PathList(ps@_*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) =>
    MergeStrategy.rename
  case PathList("META-INF", xs@_*) =>
    xs map { _.toLowerCase } match {
      case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) =>
        MergeStrategy.discard
      case ps@(x :: _) if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") || ps.last.endsWith(".rsa") =>
        MergeStrategy.discard
      case "services" :: _ =>
        MergeStrategy.filterDistinctLines
      case ("spring.schemas" :: Nil) | ("spring.handlers" :: Nil) | ("spring.tooling" :: Nil) =>
        MergeStrategy.filterDistinctLines
      case ("io.netty.versions.properties" :: Nil) =>
        MergeStrategy.first
      case _ :: "com.fasterxml.jackson.core" :: _ =>
        MergeStrategy.first
      case _ :: "commons-logging" :: _ =>
        MergeStrategy.first 
      case _ => MergeStrategy.deduplicate
    }
  case _ => MergeStrategy.first
}
<build>
    <finalName>my-project-name</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <shadedClassifierName>allinone</shadedClassifierName>
                        <artifactSet>
                            <includes>
                                <include>*:*</include>
                            </includes>
                        </artifactSet>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>reference.conf</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>MyAwesomeMainClass</Main-Class>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</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.1.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>MyAwesomeMainClass</mainClass>
                    </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>

spark-support と hadoop-fs-support の両方がプロジェクトに追加されている場合、すぐに使用できない可能性があります。 これらのモジュールは両方とも、 leceopFileSystem を実装し、異なる内容の "org.apache.hadoo.fs.filesystem" を取り込みます。 ユーザーがファットジャーをどのように構築しているかによっては、これらの実装のいずれかが廃棄され、ファイルシステムの実装が見つからない可能性があります。 この場合、両方の実装参照がマージされるようにマージ戦略を調整する必要があります。 次に、次のコマンドを実行して fat-jar を作成します。

SBT
Maven
myMergeStrategy = {
  ...
  case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") =>
    MergeStrategy.concat
  ...
}
...
        <transformer
        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/services/org.apache.hadoop.fs.FileSystem</resource>
        </transformer>
        ...

次のコマンドを実行すると、ファットジャーを作成できます。

SBT
Maven
sbt assembly
mvn package -Pplatform

」に一致する結果は 件です

    」に一致する結果はありません