Ошибка: не удалось найти или загрузить основной класс, вызванный: java.lang.classnotfoundexception с jpackageJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка: не удалось найти или загрузить основной класс, вызванный: java.lang.classnotfoundexception с jpackage

Сообщение Anonymous »

Привет, это мой первый вопрос! Я пытаюсь построить автономный котлин - Compose - Spring App. Мой клиент запросил это приложение для Windows, поэтому я хотел бы создать установщик, который включает в себя время выполнения Java (у моего клиента его нет, и он хочет, чтобы он запустился сам по себе). < /P>
the Проблема в том, что я не могу понять это правильно с JPackage. Вот как выглядит моя градл, включая команду JPackage, которую я использую: < /p>

Код: Выделить всё

plugins {
kotlin("jvm") version "1.9.10"
kotlin("plugin.spring") version "1.9.10"
id("org.springframework.boot") version "3.4.1"
id("io.spring.dependency-management") version "1.1.7"
kotlin("plugin.jpa") version "1.9.10"

//  compose
id("org.jetbrains.compose") version "1.5.10"

// kotlin - spring
//  id("kotlin") version "1.9.10"
//  id("kotlin-spring") version "1.9.10"
}

group = "com.tfra"
var appName = "MechanicManagement"
version = "0.0.1"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}

repositories {
google()
mavenCentral()
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.jetbrains.kotlin:kotlin-reflect")
compileOnly("org.projectlombok:lombok")
//  runtimeOnly("org.postgresql:postgresql")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")

implementation(compose.desktop.currentOs)
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
// https://mvnrepository.com/artifact/org.postgresql/postgresql
implementation("org.postgresql:postgresql:42.7.5")
// https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
//  implementation("com.mysql:mysql-connector-j:9.1.0")

}

compose.desktop {
application {
mainClass = "com.tfra.mechanic_management.MechanicManagementApplication"
}
}

kotlin {
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict")
}
}

allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.MappedSuperclass")
annotation("jakarta.persistence.Embeddable")
}

springBoot {
mainClass = "com.tfra.mechanic_management.MechanicManagementApplicationKt"
}

tasks.withType  {
useJUnitPlatform()
}

tasks.named("bootJar") {
archiveFileName.set("${appName}-${version}.jar")

manifest {
attributes["Main-Class"] = "com.tfra.mechanic_management.MechanicManagementApplicationKt"
}

//   Aggiunge le dipendenze al JAR
doFirst {
// Elimina eventuali duplicati
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

// Aggiunge tutte le dipendenze del classpath al JAR
from({
configurations.runtimeClasspath.get().filter { it.exists() }.map {
if (it.isDirectory) it else zipTree(it)
}
})
}

tasks.register("generateRuntimeImage") {
group = "build"
description = "Generates a custom runtime image"

val runtimeDir = layout.buildDirectory.dir("my-runtime").get().asFile

doFirst {
if (runtimeDir.exists()) {
runtimeDir.deleteRecursively() // Cancella la directory esistente
}
}

commandLine(
"jlink",
"--module-path", "${System.getProperty("java.home")}/jmods;build/libs",
"--add-modules", "java.base,java.desktop,java.sql,java.naming",
"--output", layout.buildDirectory.dir("my-runtime").get().asFile.absolutePath
)
}

tasks.register("createInstaller") {
group = "distribution"
description = "Creates a native installer for the application"

dependsOn("bootJar") // Assicura che bootJar venga eseguito prima
//  dependsOn("jar")

val outputDir = layout.buildDirectory.dir("installer").get().asFile.absolutePath
val jarPath = layout.buildDirectory.file("libs/${appName}-${version}.jar").get().asFile.absolutePath

val javaHome = System.getProperty("java.home")

doFirst {
mkdir(outputDir)
}

dependsOn("generateRuntimeImage")

commandLine(
"$javaHome/bin/jpackage",
"--type", "exe",
"--input", "build/libs",
"--main-jar", jarPath,
"--name", appName,
"--main-class", "com.tfra.mechanic_management.MechanicManagementApplicationKt",
"--dest", outputDir,
"--app-version", version.toString(),
"--icon", "src/main/resources/car_icon.ico",
"--java-options", "-Djava.awt.headless=false",
"--java-options", "-Dlogging.file=app.log",
"--resource-dir", "src/main/resources",
"--runtime-image", layout.buildDirectory.dir("my-runtime").get().asFile.absolutePath
)
}

< /code>
Это мой класс приложений Kotlin, MechanicManagementApplication.kt: < /p>
@SpringBootApplication
@EnableJpaRepositories(basePackages = ["com.tfra.mechanic_management.repository.jpa"])
@EntityScan(basePackages = ["com.tfra.mechanic_management.repository.entity"])
@ComponentScan(basePackages = ["com.tfra"])
//@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MechanicManagementApplication

fun main(args: Array) {
//  val context = runApplication()
//  application {
//      AppUI(context)
//  }
val context = runApplication(*args)

application {
Window(
onCloseRequest = ::exitApplication,
title = "Mechanic Management"
) {
MaterialTheme { // Fornisce il tema di Material Design
AppUI(context)
}
}
}
}
< /code>
Когда я запускаю сгенерированную JAR или EXE из установщика (который также должен выполнить в песочнице Windows, потому что в противном случае он не будет выполняться, и мне придется завершить, используя диспетчер задач ), Я получаю следующее: < /p>
Error: Could not find or load main class com.tfra.mechanic_management.MechanicManagementApplicationKt
Caused by: java.lang.ClassNotFoundException:  com.tfra.mechanic_management.MechanicManagementApplicationKt

Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/793 ... foundexcep
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»