🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2489閲覧

IntelliJ IDEAにてSpringBootアプリをkotlinで作成してjar出力し、CentOS7上で実行しようとするとエラーとなる。

isao

総合スコア21

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/10/11 11:21

編集2019/10/13 02:20

前提・実現したいこと

Kotlin言語とSpringBootを使用して
簡単なWebアプリ(HalloWorldレベルのものです)を作成して
IntelliJ IDEA上で実行して動作確認までは完了している状態です。

IntelliJ IDEAでjarファイルを生成する方法
の記述を参考にしてjarを出力し、CentOS7サーバ内で実行しようしたところ
エラーメッセージが表示され起動に失敗してしまいます。
対処法がありましたら教えていただけますでしょうか。

先述の参考サイトとの手順差分としては
「3. Main Classを指定して、OKをクリック」の手順にて指定している値が
環境に合わせて下記の通りとなっている点となります。
モジュール:demo3
メインクラス:com.example.demo.DemoApplicationKt
Meta-inf/Manifest.mfのディレクトリ:C:\springboot\demo3\src

■実行した際に表示されたメッセージ

[root@db1 ~]# java -jar demo3.jar 19:50:45.365 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Activating profiles [] (中略) :: Spring Boot :: 19:50:46.129 [main] INFO com.example.demo.DemoApplicationKt - Starting DemoApplicationKt on db1.i with PID 4019 (/root/demo3.jar started by root in /root) (中略) 19:50:46.716 [main] WARN org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean. 19:50:46.725 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:156) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) at com.example.demo.DemoApplicationKt.main(DemoApplication.kt:13) Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:203) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153) ... 8 common frames omitted [root@db1 ~]#

プロジェクト作成時の手順

ファイル>新規>プロジェクトを選択。
新規プロジェクト画面のSpring Initializrタブにて
プロジェクトSDKにopenJDK1.8に設定して次へをクリック。
プロジェクトメタデータの設定画面では
成果物の名称を「demo」から「demo3」、言語を「kotlin」に変更して依存関係を選択。
プロジェクト名はdemo3、
プロジェクトのロケーションはC:\springboot\demo3
としました。

■追加したクラス

kotlin

1package com.example.demo 2import org.springframework.boot.builder.SpringApplicationBuilder 3import org.springframework.boot.web.servlet.support.SpringBootServletInitializer 4import org.springframework.web.bind.annotation.GetMapping 5import org.springframework.web.bind.annotation.RequestParam 6import org.springframework.web.bind.annotation.RestController 7 8class ServletInitializer : SpringBootServletInitializer() { 9 10 override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder { 11 return application.sources(DemoApplication::class.java) 12 } 13 @RestController 14 class HelloController{ 15 @GetMapping("hello") 16 fun hello(@RequestParam("name") name: String):String="ggg Hello!,$name" 17 } 18}

下記はpom.xmlの内容です。使用しないdependency指定もありますが
それらを入れているがためにIDEA上で実行が失敗したと言う事はなかったため残しています。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <kotlin.version>1.2.71</kotlin.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory> <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <args> <arg>-Xjsr305=strict</arg> </args> <compilerPlugins> <plugin>spring</plugin> </compilerPlugins> </configuration> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-allopen</artifactId> <version>${kotlin.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>

試したこと

Meta-inf/Manifest.mfのディレクトリで設定する階層を変えてみる。
CentOS7上の既存tomcatが起動していてポートを塞いでいないか確認。
エラーログの文言(例外名や例外メッセージ)をキーワードにしてgoogle検索し同様の事例について解決策がないか調査。

補足情報(FW/ツールのバージョンなど)

■IntelliJ IDEA アルティメイト 2019.2

■CentOS7のバージョン情報
CentOS Linux release 7.6.1810 (Core)
※ホスト名はdb1.iとなっています。

■CentOS側のjavaのバージョン情報
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記2点ご確認ください。

1点目

ServletInitializerクラスですが、これは必要でしょうか?
一旦ServletInitializer.ktの拡張子をリネーム(.bakなど)して別ファイルにしてみてください。
さらに、ここに実装しているコントローラですが別のkotlinファイルにしてください。(たとえばHelloController.kt)

これでアプリケーションクラス(@SpringBootApplicationアノテーションが付いている)とHelloControllerクラスの2つだけになったと思います。

この状態でIDE上からアプリケーションを実行できるか確認してください。確認出来たら次の2点目を試してください。

2点目

jarの生成方法とその設定(Manifestファイル)ですが、参考にされたサイトの方法は不要だと思います。

IntelliJ IDEAでjarファイルを生成する方法
の記述を参考にしてjarを出力し、CentOS7サーバ内で実行しようしたところ
エラーメッセージが表示され起動に失敗してしまいます。

Mavenプロジェクトなので、ビルドはコマンドプロンプトから

mvn clean package

で行います。
ビルドが成功していればtargetディレクトリ下に実行可能なjarファイルが生成されていると思います。

実行するには、カレントディレクトリがプロジェクトディレクトリであれば

java -jar .\target\hoge.jar

を実行します。(hoge.jarは読み替えてください)
一度ローカルPC上で実行してアプリケーションが起動することを確認してください。

一応、私の手元の環境(Windows 10 + Intellij IDEA)でビルドしたjarファイルをUbuntuへ持っていき、Ubuntu上で起動できるか確認済みです。

マニフェストファイルをカスタマイズする必要があれば、その配置場所は

Meta-inf/Manifest.mfのディレクトリ:C:\springboot\demo3\src

ではなく、下記の場所になると思います。

C:\springboot\demo3\src\main\resources\META-INF\MANIFEST.MF
2019/10/14 追記

IntelliJ IDEAにもmavenが組み込まれているので、IDE上からmavenを使ってビルドすることは可能です。方法は図の通りです。
図1.のmavenをクリックしてmavenパネルを表示
図2.のLifecycleからCtrlキーを押しながらcleanとpackageをクリック(選択)
図3.の緑色のアイコンをクリックしてビルドを実行

イメージ説明

これはコマンドプロンプトからmvn clean packageを実行するのと同等です。

もう1つの方法として、Spring Initializrでプロジェクトを生成した場合、プロジェクト下にあるMaven Wrapperというコマンドを利用する方法があります。
※Maven Wrapperについては下記サイトをご確認ください。
Maven Wrapper(mvnw)を使って、Maven未インストール環境でもMavenを使えるようにする

[プロジェクトルート] | `--- /.mvn | `--- mvnw // Linux用 | `--- mvnw.cmd // Windows用

Maven Wrapperは簡単にいえば、プロジェクトに組み込まれたMavenのコマンドです。
プロジェクトルート(pom.xmlファイルがあるディレクトリ)で以下のコマンドを実行すればMavenのビルドが行われます。(初回はいろいろダウンロードされるので時間がかかると思います)

mvnw.cmd clean package

投稿2019/10/13 15:17

編集2019/10/14 10:07
rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isao

2019/10/14 09:01

ご回答ありがとうございます。 1点目についてはご指摘いただいた内容を基に構成を変更して実行できることを確認できました。 2点目についてですがmvnコマンドが利かないため手順の実行は不可能です。 IntelliJ IDEAの他にコマンドプロンプトを使わなければ 実行jarが作れないというのもいささか不効率というか不便な感じがしますので IntelliJ IDEA上の操作だけでjarは作れないとのことであればwar出力して tomcat上で動かす事はできるようになりましたのでそちらに回避するようにいたします。
rubytomato

2019/10/14 10:08

> 2点目についてですがmvnコマンドが利かないため手順の実行は不可能です。 ご事情はよくわかりませんが、mavenの実行環境がなくてもmavenでビルドする方法を回答欄に追記しましたので参考なさってください。
isao

2019/10/14 11:19

mvnコマンドについて個別にインストールした覚えがなかったのですが 教えていたたいた手順でIDEAを捜査したところ、無事に実行可能なjarが生成できました。 この度はご指導、ありがとうございました。非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問