Многопроектная конфигурация Gradle: не удалось найти или загрузить основной класс - PullRequest
0 голосов
/ 01 октября 2018

Проблема

Я строю проект с использованием Gradle, но всякий раз, когда я хочу запустить JAR вручную через java -jar <the jar>, происходит сбой со следующей ошибкой: Error: Could not find or load main class projectz.ProjectZ.

Описание

Я уже понял, что мне нужно добавить следующие строки в мой проект Gradle:

mainClassName = 'projectz.ProjectZ'

jar {
    manifest {
        attributes('Main-Class': project.mainClassName)
    }
}

Однако это не решает проблему.Я не могу выполнить свою банку.Создание той же банки с моей IDE (затмение) дает мне рабочую банку.Копирование и вставка моей папки META-INF в мой JAR-файл, сгенерированный Gradle, также не решает проблему.

Для своих настроек я использую следующие плагины:

plugins {
    id 'java'
    id 'application'
    id 'eclipse'
    id 'idea'
}

Мой проекттакже зависит от другого проекта (так как это многопроектная установка), импортируемого через зависимости Gradle: compile project (':Lib') Эта зависимость также не добавляется в мой jar-файл, но когда я запускаю installDist с Gradle, она добавляетсяи я могу запустить свой JAR (думая только о каком-то пакетном файле, который Gradle помещает в папку), и java внезапно находит мой основной класс (который является не частью зависимости, а основного проекта).Попытка запустить JAR-файл поверх обычного java -jar <jar file> способа по-прежнему не работает.

То, что я до сих пор пробовал

Я искал ошибку, которую дает мне Java, и добавил недостающие строки вмой файл build.gradle, думал, что это не решит проблему в моем случае.Я также искал в документации Gradle, чтобы выяснить, не пропустил ли я что-то там, но ничего не пропустил.

Моя настройка

  • свежая установка Java 8 (которая мояПроект использует)
  • новый проект и настройка Gradle
  • новая установка Gradle с использованием Gradle 4.10.2

1 Ответ

0 голосов
/ 03 октября 2018

jar, который вы производите с помощью скрипта сборки Gradle, - это стандартная банка, а не жирная банка (см. описание полной банки ), этопочему вы не можете выполнить эту банку напрямую с java -jar <the-jar>.У вас есть зависимости, которые не включены в этот jar-файл (по крайней мере, код из вашего зависимого проекта :Lib и, конечно, другие внешние зависимости)

Так что вы должны либо изменить свой скрипт buidld, чтобы прокрутить толстый jar, или используйте упакованное приложение, созданное с помощью подключаемого модуля application.

Для сборки толстый кувшин у вас есть различные доступные решения, например:

mainClassName = "org.mycompany.gradle.MainApp"
jar {
    manifest {
        attributes('Main-Class': project.mainClassName)
    }
    // HERE : include dependencies into the jar 
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

Там можно найти другие решения: https://www.baeldung.com/gradle-fat-jar

...