問題の説明
ジブプラグインSpringBootの成功ドッカーミラーに作られたプロジェクトが、時間エラーを実行しているミラーでピットをスキップするリーダーを助けることを望んで、一緒に問題を分析するために、今日、(メインクラス$ {開始クラス}かをロード見つかりませんでした)。
ジブプラグについて
ジブはプラグインプロジェクトは、現在のJavaプロジェクトドッカーミラーリングに組み込まれるMavenを使用することができ、を参照してください。
環境情報
- オペレーティングシステム:MacOSのモハーベ10.14.6(18G103)
- JDK:10.14.6(18G103)
- ドッカー:10.14.6(18G103)
- SpringBoot:2.1.8.RELEASE
- ジブプラグインのバージョン:1.6.1
ソースのダウンロード
問題を再現するために、私は次の表にGitHubに、アドレスやリンク情報にSpringBootプロジェクトの問題をアップロードします。
名前 | リンク | リマーク |
---|---|---|
プロジェクトホーム | https://github.com/zq2599/blog_demos | GitHubの上のプロジェクトのホーム・ページ |
gitリポジトリのアドレス(HTTPS) | https://github.com/zq2599/blog_demos.git | プロジェクトのソースコードリポジトリアドレス、httpsプロトコル |
gitリポジトリのアドレス(SSH) | [email protected]:zq2599 / blog_demos.git | プロジェクトのソースコードリポジトリアドレス、sshプロトコル |
図赤枠で示したようにgitの項目は、この章ジブ・エラー・デモ・フォルダのアプリケーションで複数のフォルダがあります。
問題:
- pom.xmlファイルディレクトリコマンドを実行MVNコンパイル-Uを清掃して以下に示すように、成功したビルドしますが、警告メッセージのコンソール出力することができミラーリング:
- このミラーのコンテナを作成しようとすると、コマンドラインドッカー--name = RUNテストbolingcavalry / hellojib:0.0.1-SNAPSHOT、次のように与えられます:
CN0014005932:~ zhaoqin$ docker run --name=test bolingcavalry/hellojib:0.0.1-SNAPSHOT
Error: Could not find or load main class ${start-class}
- ドッキングウィンドウのps -a以下のビューコンテナ情報、唯一の状態が「終了」で参照するには、他には欠けています:
CN0014005932:~ zhaoqin$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d618f6588821 bolingcavalry/hellojib:0.0.1-SNAPSHOT "java -Xms4g -Xmx4g …" 4 minutes ago Exited (1) 4 minutes ago test
- コマンドと和解することはできませんドッキングウィンドウのps -a --no-TRUNCビューコンテナ情報が切り捨てられていません。
CN0014005932:~ zhaoqin$ docker ps -a --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d618f6588821f00d3bd0b67a85ff92988b90dfff710370c9d340d5c544c550af bolingcavalry/hellojib:0.0.1-SNAPSHOT "java -Xms4g -Xmx4g -cp /app/resources:/app/classes:/app/libs/* ${start-class}" 7 minutes ago Exited (1) 7 minutes ago test
- 新しい発見、コンテナがあるときに起動するコマンドを実行するJava -Xms4g -Xmx4g -cp /アプリケーション/リソース:/アプリケーション/クラス:/アプリケーション/ libsに/ * $ {}開始クラス、Guaizai!$ {スタートクラス}は何ですか?のは、通常の起動コマンドの鏡像を見てみましょう:
java -Xms4g -Xmx4g -cp /app/resources:/app/classes:/app/libs/* com.bolingcavalry.jiberrordemo.JibErrorDemoApplication
上記に示したように、com.bolingcavalry.jiberrordemo.JibErrorDemoApplicationは、メインクラスは、このクラスのコマンドはJibErrorDemoApplication通常メインメソッドを実行することができる方法です。
- 概要:コンテナ、起動するjavaコマンドの実装$ {起動クラスを} Javaへの引数として、Javaはこのパラメータにつながる処理できないので、プロセスのエラー、コンテナを終了させ、
問題の原因
この問題の理由は単純です:複数のmainメソッドを持つクラスのJavaプロジェクト、Utils.javaで見つかったコードジブ誤りデモプロジェクト、を見て、本当にmainメソッドを持っています。
public class Utils {
public static String time(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()).toString();
}
public static void main(String[] args){
System.out.println(time());
}
}
上記の主な方法は、削除した後、コンテナミラーをビルドして実行、問題が解決されたことが確認されました。
問題に対する別の解決策
あなたは、コードUtilsのクラス(メインクラスのメソッドを持つかもしれないのjarパッケージ)、のpom.xmlファイルのオープンを移動したい場合は、プラグインの増加がジブ配置さmainClassのノードを、ノードのコンテンツクラスは、半月のように、指定されたクラスでありますこのように:
上記の設定後、問題が解決することができます。
あなたは深い理由に興味があるなら次に、のは、それを深く探求してみましょう。
問題を探します
- 公式のGitHubのジブではこの問題は、記録されている次のアドレスを初めて目にします。https://github.com/GoogleContainerTools/jib/issues/1601、赤示すようにボックス、同じ問題、そして最後に問題は、自分自身のスポンサー、彼は彼のプロジェクトが主な方法で2つのクラスを持っていることがわかったので、問題を閉じました。
- ジブ著者Q陳は春と推測、https://github.com/GoogleContainerTools/jib/issues/170、のは、この問題を見てみましょう$ {開始クラスは}個人(この文字列は、Main-Class属性値に設定されていますそうジブプラグインの価値はメインクラスを使用した場合、)春はMAVEの春ブーツはそれをプラグインであることをここで感じて、取得することである$ {開始クラス}の文字列を:
- この問題は非常に興味深いですJavaプロジェクトがそれを処理するために正確にどのようにmainメソッド、ジブで複数のクラスを発見した場合、その後のエピソード170は、この問題に関するジブ著者Q陳は非常に、絡まっていますか?以下に示すようにQ陳は最終的に、出力に警告を決めました。
- #288上記の図である。このコードはそれを見て、取る、アドレスは次のとおりです。https://github.com/GoogleContainerTools/jib/pull/228/files/c8757e1f9ea47edd78df18142de7836a68f22034、mainClassクラスのクラス名とは異なりあれば、警報を出力し、のGradleとMavenプラグインでこのロジックが書き込まれます。
一つの最後の質問:mainClass上記のコードから来ますか?マップ上のオープンソースは、アドレスは次のとおりです。https://github.com/GoogleContainerTools/jib/blob/c8757e1f9ea47edd78df18142de7836a68f22034/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/BuildImageMojo .java、赤いボックス構築プラグインSpringBoot Mavenプロジェクトからの値、メソッドの名前から推測することができるので、フロント前記値Qチェンメインクラスの変数はスプリング修正されるように、このコードから派生しなければならない。
この場合、まだもっと何かを言っている場合は、我々はスタートクラスSpringBootの統合で別の顔をしていますスタートクラスについて
- 実際にSpringBoot学生馴染み$ {起動クラス}は不思議ではない、場合に、両方のエンジニアリングにおける複数のクラスのメインメソッドが開始SpringBootクラスを指定するには、このパラメータを使用する場合、
- 文書に精通しSpringBootの公式を見て起動し、クラス、アドレスは次のとおりです。https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/、次の図は、キーの内容を比較しています。我々は、起動クラスを設定します割り当てられているスタートクラスの属性、およびメインクラスの属性はなりorg.springframework.boot.loader.JarLauncher、これが本当のスタートSpringBootカテゴリであります:
- 以下に、これは補足説明であり、メインクラスのプロパティの値がに転送されるスタート・クラス行うにはプラグジャーMavenを構築するときに、この操作の属性:
したがって、メインクラスから開始クラスの値は、メインクラスの値が検索しますMavenのウィジェットと、図赤のボックスに示すように、来る見えるパブリック静的な無効メイン(文字列[]引数) クラス:
これまでのところ、問題ジブは分析を構築し、ミラーリングが完了すると、小さな問題が学び、探求发了这么多引用し、ビット時間のかかるけれども、それは、人々が再び感じる「技術は同じである」感じることができ、私はあなたがそのようなを持っていないかわかりませんそれを感じますか?プログラマ陳新:私は公共の数字の関心を歓迎します