Java アプリケーションの slug のサイズの削減
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年05月15日(月)
Table of Contents
Git を使用してデプロイする場合は、非常に大きな Java アプリケーションがそのプラットフォームの slug のサイズ制限を超えることが一般的です。これが発生する場合は、デプロイしたときに次のようなエラーが表示されます。
remote: -----> Compressing...
remote: ! Compiled slug size 583.3MB is too large, max is 500 MB.
この問題を緩和するには、Git 以外のデプロイへの切り替えを含め、いくつかの方法があります。この記事では、これを実行する方法と、slug のサイズを削減するようにアプリケーションを設定する方法について学習します。
Maven Clean プラグインを使用したビルド成果物の削除
Maven Clean プラグインは、ビルドが完了した後に重要でない成果物を削除するように設定できます。たとえば、アプリケーションが WAR ファイルにパッケージ化されており、すべての JAR ファイルを削除したい (すでに WAR ファイル内に複製されているため) 場合は、pom.xml
で次のようにプラグインを設定できます。
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>clean-jar-artifacts</id>
<phase>install</phase>
<goals><goal>clean</goal></goals>
<configuration>
<excludeDefaultDirectories>true</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>target/dependency/*.jar</directory>
</fileset>
</filesets>
</configuration>
</execution>
</executions>
</plugin>
これにより、install
フェーズの後、slug からすべての target/dependency/*.jar
ファイルが削除されます。
<configuration>
要素のその他の一般的なパターンとして、WAR ファイルを除く target/
ディレクトリ内のすべての削除があります。
<fileset>
<directory>target</directory>
<excludes>
<exclude>*.war</exclude>
</excludes>
</fileset>
または、JavaScript アセットの事前コンパイルにのみ必要であった Node.js の依存関係の削除があります。
<fileset>
<directory>node_modules</directory>
</fileset>
<fileset>
<directory>.heroku/node</directory>
</fileset>
この設定は、ビルド中に JavaScript 最適化を実行するために Java buildpack が Node.js buildpack と組み合わされている場合に特に一般的です。
Gradle での doLast の使用
Gradle のデプロイの場合は、次のように、doLast
ディレクティブを含む stage
タスクを作成できます。
task stage {
dependsOn build
doLast {
delete fileTree(dir: "build", exclude: "libs")
delete fileTree(dir: "build/libs", exclude: "*.jar")
}
}
削除されるファイルは、アプリケーションによって異なります。
テストの依存関係の除外
ビルド時に maven-dependency-plugin
を使用して JAR ファイルを slug にコピーしている場合は、テストの依存関係を除外することもできます。これを行うには、プラグインの設定で <includeScope>
値を設定します。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals><goal>copy-dependencies</goal></goals>
<configuration>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
含まれるスコープはデフォルトで、テストの依存関係が含まれている test
になるため、それらが compile
によって実際に除外されます。
.slugignore
ファイルの追加
Git リポジトリに、実行時には必要がないバイナリまたはその他の大きなファイルが含まれている場合は、Git リポジトリのルートに .slugignore
ファイルを作成することによって、それらを slug から除外できます。
Git リポジトリに、テストを実行するときにのみ必要な大きなファイルが含まれていることは非常に一般的です。この場合、.slugignore
ファイルは次のようになります。
*.psd
*.pdf
/test
heroku run bash
を実行し、ls
や du
などのコマンドを使用することによって、slug の抽出された内容を検査できます。これは、.slugignore
ファイルに追加する必要がある大きなファイルの識別に役立つ可能性があります。実際に除外するべきファイルは、各アプリケーションのニーズによって異なります。
Heroku Maven プラグインの使用
heroku-maven-plugin は Git デプロイを完全に回避し、slug をローカルでビルドしてから Heroku にプッシュします。これにより、アプリケーションを実行するために絶対的に必要なファイルのみをパッケージ化できます。
slug に追加のディレクトリを含める必要がある場合は、<includes>
要素を使用して実行できます。次に例を示します。
<includes>
<include>etc/readme.txt</include>
</includes>
これらの提案を実装しても、引き続き大きすぎる slug が生成される場合は、Heroku サポートに連絡してください。