#java #classpath
#java #classpath
Вопрос:
чтобы запустить тесты, я должен установить большой список файлов jar в качестве аргументов для classpath: -classpath a.var;b.jar ;…. — Есть ли другой способ указать библиотеки? например, возможно ли установить файл в качестве аргументов, и файл содержит путь ко всем библиотекам пример: -classpath myFile.txt и myFile.txt содержит ../a.jar ../b.jar .. etc
Спасибо,
Ответ №1:
Вы можете программно добавить новый путь к classpath:
String currentPath = System.getProperty("java.library.path");
System.setProperty( "java.library.path", current ":/path/to/my/libs" );
// this forces JVM to reload "java.library.path" property
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
Вы можете добавить путь, поэтому нет необходимости перечислять все jar. Это изменяет classpath только для вашего экземпляра JVM, поэтому это не повлияет на другие приложения Java.
Обновить:
:
и /
являются специфичными для UNIX разделителями путей к библиотекам и папкам. Для нескольких ОС вам следует использовать системные свойства «path.separator» и «file.separator».
Комментарии:
1. не могли бы вы разработать больше, пожалуйста? например, у меня есть lib1.jar ,lib2.jar ,…libi.jar которые доступны в разных папках, как я могу изучить ваше предложение? Спасибо
2. Добавьте дополнительные пути: `»:/path/to/my/libs1:/path/to/mylibs2:/path /etc»
Ответ №2:
Вы можете задать переменную среды CLASSPATH (для этого используйте соответствующий синтаксис для вашей командной строки, например, bash, Windows XP и т.д.).
Вы также можете создать какой-нибудь файл профиля, который делает это за вас постоянно, например .bashrc. Конечно, это будет влиять на каждый раз, когда java
команда используется в этом профиле.
Если ваш основной класс находится в jar, вы также можете использовать манифест jar для задания classpath. У Sun / Oracle есть страница руководства по выполнению этого. Создайте файл с именем Manifest.txt . В этом файле добавьте строку:
Путь к классу: jar1-name jar2-name directory-name/jar3-name
где различные jar1-name
части являются фактическими jar в вашем classpath.
Затем создайте свой jar, используя:
jar cfm MyJar.jar Manifest.txt MyPackage/*.class
Или задача Ant Jar с установленным атрибутом manifest, или используйте плагин Maven jar, или как бы ни работала ваша сборка, получите набор манифеста для jar.
Или продолжайте использовать —classpath, как вы используете в данный момент.
Ответ №3:
Начиная с Java 6, вы можете использовать подстановочные знаки в classpath, чтобы включить все jar-файлы в каталог. Смотрите http://download.oracle.com/javase/6/docs/technotes/tools/windows/classpath.html .
Комментарии:
1. Это очень удобно, но и очень опасно, поскольку порядок сортировки jar зависит от файловой системы. Это потенциально может вызвать неприятные ошибки пути к классу при наличии конфликтующих классов, поскольку разные jar могут иметь приоритет в разных средах.
Ответ №4:
Начиная с Java 6, вы можете использовать подстановочные знаки в вашем classpath:
java -classpath 'lib/*'
Обратите внимание, что вы должны заключить строку classpath в кавычки, чтобы оболочка не разворачивала подстановочный знак.
Комментарии:
1. Я думаю, что это скорее java -classpath lib/*
2. @Michael Borgwardt: от download.oracle.com/javase/6/docs/technotes/tools/windows /… : «Например, запись пути к классу foo/* указывает все файлы JAR в каталоге с именем foo».
3. @JB: именно тогда foo/* — это то, что передается инструменту Java. Но этого не произойдет, потому что оболочка расширит подстановочный знак, и вы эффективно вызовете java -classpath foo/a.jar foo/b.jar foo/c.jar — что приводит к ошибке
4. @Майкл Боргвардт: Хорошо. Я забыл цитату, и у вас была библиотека /*.jar вместо библиотеки /*.
5. @JB: А, теперь я понимаю, что ты имеешь в виду. Это изменится.
Ответ №5:
Для обеденных тестов я настоятельно рекомендую вам использовать Ant.
И у Ant есть <classpath>
элемент, который позволяет вам указать «все банки в пределах данного каталога»:
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
<dirset dir="${build.dir}">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</dirset>
<filelist refid="third-party_jars"/>
</classpath>