Добавляет ли Gradle внешние зависимости (jar) к пути к классу?

#dependencies #gradle

#зависимости #gradle

Вопрос:

Я работаю над проектом для школы, и мне понадобилась библиотека Jackson для разбора файлов json. Я включил библиотеку в свой скрипт gradle следующим образом :

 ...
dependencies {
    compile 'org.codehaus.jackson:jackson-core-asl:1.9.0'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.0'
    compile 'org.hibernate:hibernate-validator:4.2.0.Final'
    testCompile 'junit:junit:4.9'
}
...
  

Я также добавил свою папку classes в classpath.
сборка с gradle в порядке, она фактически загружает библиотеки и все такое, но когда я запускаю свою программу ( из строки cmd с> java name.of.package.Main ) в нем говорится :

 > Exception in thread "main" java.lang.NoClassDefFoundError:
> org/codehaus/jackson/map/JsonMappingException
>         at java.lang.Class.getDeclaredMethods0(Native Method)
>         at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
>         at java.lang.Class.getMethod0(Unknown Source)
>         at java.lang.Class.getMethod(Unknown Source)
>         at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
>         at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) Caused by: java.lang.ClassNotFoundException:
> org.codehaus.jackson.map.JsonMappingException
>         at java.net.URLClassLoader$1.run(Unknown Source)
>         at java.net.URLClassLoader$1.run(Unknown Source)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(Unknown Source)
>         at java.lang.ClassLoader.loadClass(Unknown Source)
>         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
>         at java.lang.ClassLoader.loadClass(Unknown Source)
>         ... 6 more
  

но я заметил, что когда я добавляю те же две библиотеки из файла gradle в classpath, все в порядке ..

кто-нибудь может мне сказать, должен ли я вручную добавлять библиотеки в classpath? какая тогда польза от gradle в этом случае ..

большое спасибо!

Ответ №1:

Gradle не устанавливает CLASSPATH переменную окружения (если вы это имеете в виду). Плагин приложения позволяет запускать приложение командной строки с помощью gradle run . Плагин также может создавать сценарии оболочки для запуска приложения. В обоих случаях в JVM будет передан правильный путь к классу.

Комментарии:

1.спасибо за ваш ответ! на самом деле, поскольку это школьный проект, у меня нет возможности добавить плагин приложения, у меня есть инструкции, которым я должен следовать, и в этих инструкциях говорится, что я должен настроить свой build.gradle , ввести в командной строке gradle build, затем ввести в java name.of.package .Основной arg1. по какой возможной причине он не может найти классы из библиотек, хотя и загружен gradle из MavenCentral? еще раз спасибо, мне это действительно нужно.

2. Загрузка библиотек — это одно; сообщать о них java команде — совсем другое. Gradle не сможет помочь вам с этим, если вы вызовете java команду напрямую. Вам придется использовать опцию -cp или установить CLASSPATH переменную. Чтобы упростить это, вы бы сначала скопировали все необходимые библиотеки в каталог, например: «task copyLibs(type: Copy) { из configuration.runtime; в «lib» }