как задать аргумент для classpath

#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>