Дополнительно
Включение всех банок в каталог в пределах пути классов Java
Есть ли способ включить все jar-файлы в каталоге в classpath?
Я пробую java -classpath lib/*.jar:. my.package.Program
и он не может найти файлы классов, которые, конечно же, находятся в этих банках. Нужно ли мне добавить каждый jar-файл в classpath отдельно?
963
20
Используя Java 6 или более поздней версии, параметр classpath, который поддерживает подстановочные знаки. Обратите внимание на следующее:
"
в)*
, а не*.банк
Окна
&ГТ;
Ява -СР "и Test.jar;Либ/*" Мой.пакет.MainClass
В Unix
&ГТ;
Ява -СР "и тест.банки:Либ/*" Мой.пакет.MainClass
Это похоже на Windows, но использует
:
вместо;
. Если вы не можете использовать подстановочные знаки,Баш
предлагает следующий синтаксис (гделиберал
- это директория, содержащая все файлы архива с Java):&ГТ;
Ява -СР $(Эхо Либ/*.банки | тр ' ' ':')
(Обратите внимание, что использование classpath-это несовместимо с опцией
-банк
. См. также: https://stackoverflow.com/questions/13018100/execute-jar-file-with-multiple-classpath-libraries-from-command-prompt)Понимание Подстановочные Знаки
От классов документ:
&ГТ; записи пути к классу, может содержать подстановки имени файла символ
*
, который является эквивалентным определению списка всех файловПримечание: из-за известной ошибки в Java 8, примеры Windows должны использовать обратную косую черту предыдущих записях с задней звездочкой: https://bugs.openjdk.java.net/browse/JDK-8131329
Под Windows это работает:
и это не работает:
обратите внимание на *.фляги, *так шаблоны должны использоваться отдельно**.
На Linux, следующие работы:
Сепараторы двоеточие вместо точки с запятой.
Мы можем обойти эту проблему путем развертывания основные myapp.jar Джар файл, который содержит манифест (
Манифеста.файл MF) с указанием classpath в других необходимых банки, которые затем развертываются вместе с ним. В этом случае вам нужно только объявить
Ява -фляга myapp.jar когда выполняется код.Поэтому при развертывании главной
фляги
в какую-нибудь папку, а потом поместить зависимые JAR-файлы в папке Либ `под манифест выглядит так:NB: это не зависит от платформы - мы можем использовать те же баночки для запуска на Unix-сервере или на компьютере с ОС Windows.
Мое решение на Ubuntu 10.04 с помощью Java-солнце 1.6.0_24 имея все банки в "каталог lib и quot;:
в <предварительно&ГТ;Ява -СР .:Либ/* мой.главная.Класс&ЛТ;/пре&ГТ;
Если это не удается, следующая команда должна работать (выдает все *.баночки в lib каталог в classpath парам)
в <предварительно&ГТ;Ява -СР $(для меня в lib/*.фляги ; делать Эхо -N $я: ; сделал). мой.главная.Класс&ЛТ;/пре&ГТ;
Короткий ответ:
в Java -classpath в Либ/*:. мой.пакет.Программа
Oracle предоставляет документацию об использовании подстановочных знаков в пути к классам здесь для Java 6 и здесь для Java 7, под заголовок раздела понимание пути к классу шаблоны. (Как я пишу это, две страницы содержат ту же информацию.) Здесь'с резюме основных моментов:
В общем, все баночки в данной директории, вы можете использовать специальный символ
*
(не*.фляга
).Подстановочный знак соответствует только банки, а не Class-файлы; чтобы получить все классы в каталоге, просто прекратить запись classpath на имя каталога.
Этих двух вариантов можно совместить для того чтобы включить все jar и Class файлы в каталоге, и обычные правила приоритета применяются к классам. Е. Г.
-СР /классы;/банки/*
В маске, не ищите банки в поддиректориях.
Вышеперечисленные пункты верны, если вы используете
классов
системное свойство или-СР
иликласса
флаги командной строки. Однако, если вы используете класс-путь манифест заголовок баночку (как вы могли бы сделать с файл сборки Ant), специальные символы будут не будет заслуженный.Yes, моей первой ссылке-тот же самый, представленная в топ-скоринга ответа (которого у меня нет надежды на обгон), но ответа не'т предоставить больше объяснений за ссылку. Поскольку такого рода поведение discouraged на переполнение стека в эти дни, я думал, что я'd и расширить его.
Для меня это работает в Windows .
Для Linux
Я использую Ява 6
Окна:&ЛТ;БР/&ГТ;
яз-Баш Ява -СР file.jar;реж/* мой.приложение.Имя_класса
Линукс:&ЛТ;БР/&ГТ;
яз-Баш файл Java-СР.банки:реж/* мой.приложение.Имя_класса
Напоминаю:&ЛТ;БР/&ГТ;
;
&ЛТ;БР/&ГТ;:
&ЛТ;БР/&ГТ;Вы можете попробовать Джава
-Джава.ВН.Дирс=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlКаталог внешних банок при запуске Java
Правильно:
Неправильно:
Если вам действительно нужно указать все файлы .jar динамически, вы можете использовать сценарии оболочки или [Apache Ant][1]. Существует проект Commons под названием [Commons Launcher][2], который позволяет указать ваш сценарий запуска в качестве файла сборки ant (если вы понимаете, о чем я).
Тогда вы можете указать что-то вроде:
Если вы используете Java 6, то вы можете использовать подстановочные знаки в пути к классу.
Теперь можно использовать символы подстановки в определение классов:
Реф: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
Обратите внимание, что подстановочных разбивается для Java 7 на Windows.
Проверьте это issue сайте StackOverflow для получения дополнительной информации.
Для решения этой проблемы нужно поставить точку с запятой после подстановки
. Ява -СР "и где/*; и quot;
Для кого это может касаться,
Я нашел это странное поведение в Windows под префикса msys/MinGW в раковину.
*Работы:
в <!-- язык: нет --&ГТ;
Не'т работу:
в <!-- язык: нет --&ГТ;
Я совершенно уверен, что шаблон не расширены оболочки, потому что например
(Пробовал с другой программы, а не встроенные в "эхо", с тем же результатом.)
Я считаю, что это'ы
и javac
, который пытается развернуть его, и он ведет себя по-разному, существует ли точка с запятой в аргументе или нет. Во-первых, он может пытаться развернуть все аргументы, которые выглядят как тропинки. И только тогда она будет разбирать их, с-СР
берет только маркер. (Обратите внимание, что `com.comsol.aco_1.0.0.jar-вторая баночка в этом каталоге.) Что's все угадать.Это
Все вышеперечисленные решения работают здорово, если бы вы разработать и запустить Java-приложение вне IDE, например Eclipse или NetBeans.
Если вы находитесь на Windows 7 и средой разработки Eclipse для разработки на Java, вы можете столкнуться с проблемами при использовании командной строки для запуска класса файлов причине внутри затмения.
Е. Г. Ваш исходный код в Eclipse, имеющих следующую иерархию пакета: edu.sjsu.myapp.Main.java
У вас есть json.jar в качестве внешней зависимости для Main.java
При попытке запуска Main.java из Eclipse, он будет работать без каких-либо проблем.
Но когда вы попытаетесь запустить с помощью командной строки после компиляции Main.java в Eclipse, он будет стрелять какой-то странной ошибки, сказав, что "Ошибка ClassNotDef бла бла" по.
Я предполагаю, что вы находитесь в рабочем каталоге вашего исходного кода !!
Используйте следующий синтаксис, чтобы запустить его из командной строки:
&ГТ;и javac -СР и quot;.;в JSON.банку с" Main.java
&ГТ;Ява -СР и quot;.;в JSON.банку" по Эду.sjsu.приложение myapp.Главная
[Дон'т пропустите . выше]
Это потому, что вы разместили Main.java внутри пакета еду.sjsu.myapp и java.exe буду искать точный шаблон.
Надеюсь, что это помогает !!
Для Windows, кавычки обязательны и должны быть использованы в качестве разделителя. например:
Сокращенная форма: Если в банке, вы'будете, вероятно, нужно еще '-фляга pathTo/yourJar/YourJarsName.jar ' явно, чтобы заставить его работать (хотя 'YourJarsName.опарник' был в classpath) (или, выразил, чтобы ответить на исходный вопрос, который был задан 5 лет назад: вы не'т нужно явно объявить каждую банку, но, кажется, даже с java6 вы должны переопределить свои фляги ...)
Длинное Форма: (Я'ве сделал это явно до того, что я надеюсь, даже незваного гостя на Java может воспользоваться этим)
Как и многие здесь, я'м с помощью Eclipse для экспорта банок: (Файл->экспорт--&ГТ;'готов к запуску jar-файл'). Есть три варианта на 'транспортная обработка библиотека' затмение (Юнона) предлагает:
Как правило, я'd с помощью параметр2 (и параметр1 точно было нарушение), однако машинный код в одной из баночек я'м через я обнаружил разрывы с удобной и quot;jarinjar" и трюк, что Eclipse использует, когда вы выбираете эту опцию. Даже поняв, что мне нужно параметр3, а затем найти в этом сайте StackOverflow запись, он все-таки взял меня некоторое время, чтобы выяснить, как запустить мой главный из Eclipse, так вот's то, что работал для меня, как это's полезный для других...
Если вы назвали ваш банку: "и fooBarTheJarFile.банку" и и все имеет значение экспорта в Реж: " и/theFully/qualifiedPath/toYourChosenDir и quot;.
(имеется в виду 'экспортного' поле читать: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.опарник' )
После того, как вы нажмете готово, вы'll найти то затмение ставит все библиотеки в папку с названием 'fooBarTheJarFile_lib' в этой директории экспорта, давая вам что-то вроде:
Затем вы можете запустить в любом месте на вашей системе с:
(Для Java начинающих: 'упаковка.path_to.the_class_with.your_main' - это объявленное пакет-путь, который вы'll найти вверху 'TheClassWithYourMain.Ява' файл, содержащий 'основные(string[] аргументы){...}' что вы хотите запустить извне Ява)
Ловушка заметить: - это что, 'fooBarTheJarFile.опарник' в списке банки на заявленные classpath-это не достаточно. Вы должны явно объявить ' банка', и переобъявить эти банки.
например, это нарушает:
пересчитано с относительными путями:
(используя Java версии "и 1.6.0_27 и quot;; через OpenJDK 64-разрядной виртуальной машины сервера на Ubuntu 12.04)
класс от wepapp:
Единственный способ я знаю, как сделать это индивидуально, например:
Надеюсь, что помогает!
Не прямое решение, чтобы быть в состоянии установить /* к -СР, но я надеюсь, что вы могли бы использовать следующий скрипт, чтобы облегчить ситуацию немного для динамического класса-пути и lib.
Сценарий для Linux, может есть подобное для Windows. Если соответствующий каталог предоставляется в качестве входных данных в "libDir2Scan4jars и quot;; скрипт будет сканировать все баночки и создания classpath строку и экспортировать его в env переменную "и tmpCLASSPATH и quot;.
Вам нужно добавить их все по отдельности. В качестве альтернативы, если вам действительно нужно указать только каталог, вы можете разархивировать все в один каталог и добавить его в classpath. Однако я не рекомендую такой подход, так как вы рискуете получить странные проблемы с версионированием и неуправляемостью classpath.