【spring】kotlinで作ったプロジェクトのjarファイル作成
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 595
前提・実現したいこと
作ったアプリケーションをherokuを使ってデプロイしたいと思い、procfileにjarファイルを実行させたいのですがうまいことjarファイルが作れないです。
発生している問題・エラーメッセージ
$:java -jar ./build/libs/ProjectName-SNAPSHOT.jar
を実行すると次のようなエラーが出ます。
Exception in thread "main" java.lang.NoSuchMethodException: com.example.ProjectNameApplication.main([Ljava.lang.String;)
該当のソースコード
ProjectNameApplication.kt
package com.example.ProjectName
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class ProjectNameApplication
fun main(args: Array<String>) {
runApplication<CircleIntroductionApplication>(*args)
}
build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
application
id("org.springframework.boot") version "2.2.6.RELEASE"
id("io.spring.dependency-management") version "1.0.9.RELEASE"
kotlin("jvm") version "1.3.71"
kotlin("plugin.spring") version "1.3.71"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8
springBoot{
mainClassName = "com.example.ProjectName.ProjectNameApplication"
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.h2database:h2")
implementation("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
}
application {
// Define the main class for the application
mainClassName = "com.example.ProjectName.ProjectNameApplication"
}
val jar by tasks.getting(Jar::class) {
manifest {
attributes["Main-Class"] = "com.example.ProjectName.ProjectNameApplication"
}
from(
configurations.compile.get().map {
if (it.isDirectory) it else zipTree(it)
}
)
}
tasks.withType<Test> {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
試したこと
エラーからMain-Classにmainメソッドがないというのはわかるのですがmainメソッドがどこにあるのか分からないです。(ProjectNameApplecationクラスの中にあるのだと思ってました)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
manifest {
attributes["Main-Class"] =
"com.example.ProjectName.ProjectNameApplication"
}
とMain-Classを定義しているが、
package com.example.ProjectName
@SpringBootApplication class ProjectNameApplication
fun main(args: Array<String>) {
runApplication<CircleIntroductionApplication>(*args)
}
と実装しているので、mainメソッドはProjectNameApplicationクラスには定義されていない。
mainメソッドは、パッケージに定義されている。だから、ソースファイル名ProjectNameApplicationKt.kt から com.example.ProjectName.ProjectNameApplicationKtクラスに定義されてるはず。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
mainメソッドをCircleIntroductionApplicationクラスに定義すると無事実行可能なjarファイルを作成する事ができました。
javaの場合を参考にkotlinで似たように書きました
public class Sample {
public static void main(String args[]){
System.out.println("Hello! World!");
}
ProjectNameApplication.kt
package com.example.ProjectName
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
open class ProjectNameApplication {
companion object {
@JvmStatic fun main(args: Array<String>) {
runApplication<ProjectNameApplication>(*args)
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/04/29 21:50
実行時に-cpでjarファイルを指定するのもいいが、[Shadow](https://github.com/johnrengelman/shadow)などをつかって、関連するライブラリも含めたjarファイルを作る方法もある。