Скомпилируйте скрипт groovy со всеми его зависимостями, которые управляются gradle, а затем запустите его как отдельное приложение через командную строку

У меня есть простой Groovy скрипт с одной зависимостью библиотеки Java:

package com.mrhacki.myApp

import me.tongfei.progressbar.ProgressBar

    class Loading {        
        static void main(String[] arguments) {        
            List list = ["file1", "file2", "file3"]        
            for (String x : ProgressBar.wrap(list, "TaskName")) {
                println(x)
            }        
        }
    }

Я использую Gradle для управления зависимостями проекта. Конфигурация gradle для проекта также довольно проста:

plugins {
    id 'groovy'
}

group 'com.mrhacki'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    compile 'me.tongfei:progressbar:0.7.2'
}  

Если я запускаю сценарий из Intellij IDE, сценарий выполняется должным образом.

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

Я пробовал с несколькими примерами толстых банок, но ни один из них не работал, так как файл.jar постоянно выдает Could not find or load main class Loading когда я пытаюсь это запустить.

Если бы кто-то был так любезен, чтобы дать подсказку или показать пример задачи, которая могла бы выполнить сборку, которая соответствует моим описанным потребностям, я был бы очень благодарен.

Я знаю о заводной модуль Grape с @Grab аннотации тоже, но я бы оставил это в качестве крайней меры, так как я не хочу, чтобы пользователи ждали загрузки зависимостей, и хотел бы связать их с приложением.

Я использую Groovy 2.5.6 и Gradle 4.10 для проекта

Спасибо

1 ответ

Решение

Вы можете просто создать флягу без каких-либо дополнительных плагинов, используя jar Задача. Для простого / маленького проекта, подобного вашему, это должно быть просто:

jar {
    manifest {
        // required attribute "Main-Class"
        attributes "Main-Class": "com.mrhacki.myApp.Loading"
    }

    // collect (and unzip) dependencies into the fat jar
    from {
        configurations.compile.collect { 
            it.isDirectory() ? it : zipTree(it) 
        }
    }
}

РЕДАКТИРОВАТЬ: пожалуйста, примите во внимание другие комментарии: если у вас есть более одной внешней библиотеки, у вас могут быть проблемы с этим решением, так что вам следует искать решение с "теневыми" плагинами в этом случае.

Другие вопросы по тегам