2013-07-08 2 views
0

У меня есть сценарий на моем компьютере, который запускает другие скрипты в зависимости от того, какую команду я набираю. Эти задачи часто выполняются и, как правило, нужны только несколько аргументов (например, обновление репозитория git). Это делается с использованием сценариев bash, но я хотел добавить больше гибкости, поэтому я конвертирую его в Java.Занятия не загружены должным образом?

Существует отдельный файл, который используется для регистрации этих команд. Я использую следующий синтаксис:

name, alias1, alias2,... (one or more tabs) path.to.main.class

Когда команда Введен находит этот файл, чтобы найти правильный путь к классам загрузки.

name - это название команды (а также фляги), которая используется для вывода и для поиска соответствующей банки. Затем он использует path.to.main.class для загрузки этого класса. Поскольку этот класс extends абстрактный класс, который я создал, я затем вызываю метод, называемый onCommandRun, сам по себе.

Каждая команда экспортируется в банку, хотя большинству нужен только один файл класса для запуска. Существует команда, которая требует трех классов (хотя я мог бы просто придерживаться их в одном классе, но мне не нравятся внутренние классы).

Моя проблема, главный класс что баночка нагрузки хорошо, но когда я использую один из двух других утилитов класса он должен работать, я получаю NoClassDefFoundError/ClassNotFoundxception

И от моего понимания, JVM загружает классы, в которых он нуждается, когда им это нужно, так почему у него возникают проблемы с загрузкой других классов?

Дополнительно: каждый «командный ящик» находится в отдельной папке, чем основная баночка, контролирующая все.

0 # # # # # # # # # # # # # # # #: Причина, по которой разделение каждой команды в ее собственный банку, потому что главная банка, все контролирует все, будет запускать только одну команду, так зачем регистрировать все команды (и загружать) все команды, когда только один собирается использовать, а затем программа выходит? Кроме того, я хотел, чтобы он был динамичным.

+1

Зачем регистрироваться все команды? Поскольку вы не сохраняете какое-либо время, делая это по-своему, а динамическая загрузка сложна (как вы видите). Кроме того, почему вы выбрали Java над Bash для этой задачи? Кажется, что вы повторно изобретаете функции Bash. Если вы действительно хотите сделать это таким образом, пожалуйста, включите соответствующий код. (Как вы загружаете банки, полную трассировку стека и где она указывает и т. Д.) –

+0

Был ли мой ответ полезен? – jesseplymale

ответ

0

Я предполагаю, что ваш главный сценарий (тот, который считывает файл с отображением от имени и псевдонимов к полному имени класса Java) есть строка, которая имеет что-то вроде:

java -cp "/path/to/main.jar:/path/to/specificCommand.jar" com.example.MainClass 

Я m, предполагая, что путь к классам (как определено -cp) в настоящее время имеет только файл jar для вашей конкретной команды. Однако файл jar для конкретной команды не загружается автоматически в основной файл jar, который содержит ваш абстрактный класс (плюс любые другие общие классы, которые у вас там есть). Вам нужно сделать, чтобы файлы jar, содержащие любые классы, которые вам нужны, указаны в аргументе -cp.

Я хочу сделать быстрый штекер для Groovy в качестве языка сценариев, который дает вам полный доступ к библиотекам Java (особенно через его аннотации @Grab).

Смежные вопросы