2016-08-17 4 views
0

Я пытаюсь запустить банку с зависимостями. Приложение работает отлично в Intellij, но когда я пытаюсь запустить баночку я получаю:NoClassDefFoundError в jar, но не в Intellij

>> java -jar test-0.1.0.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: com/atlassian/httpclient/apache/httpcomponents/DefaultHttpClient 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousHttpClientFactory.createClient(AsynchronousHttpClientFactory.java:53) 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.create(AsynchronousJiraRestClientFactory.java:35) 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.createWithBasicHttpAuthentication(AsynchronousJiraRestClientFactory.java:42) 
     at Main.main(Main.java:19) 
Caused by: java.lang.ClassNotFoundException: com.atlassian.httpclient.apache.httpcomponents.DefaultHttpClient 
     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) 
     ... 4 more 

Мой build.gradle выглядит следующим образом:

group 'test' 
version '1.0-SNAPSHOT' 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.9' 
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip" 
} 

apply plugin: 'java' 
apply plugin: 'idea' 
apply plugin: 'application' 

sourceCompatibility = 1.8 

mainClassName = "Main" 

repositories { 
    mavenCentral() 
    maven { 
     url 'https://maven.atlassian.com/content/repositories/atlassian-public/' 
    } 
} 

jar { 
    baseName = 'test' 
    version = '0.1.0' 

    from { 
     configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
     configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } 
    } 

    manifest { 
     attributes 'Main-Class': 'Main' 
    } 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 

    compile 'com.atlassian.jira:jira-rest-java-client-parent:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-core:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-api:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-plugin:3.0.0' 
    compile 'com.atlassian.fugue:fugue-parent:2.6.1' 
    compile 'com.atlassian.fugue:fugue:2.6.1' 
} 

Я также попытался добавить transitive=true к каждому компилировать статьи но безрезультатно.

ответ

0

Вы должны set CLASSPATH

Путь класса это путь, который выполняет поиск выполнения среды Java для классов и других файлов ресурсов. Путь поиска класса (более известный по более короткому имени, «путь к классу») может быть задан с помощью параметра -classpath при вызове инструмента JDK (предпочтительный метод) или путем установки переменной среды CLASSPATH. Опция -classpath предпочтительнее, потому что вы можете установить ее отдельно для каждого приложения, не влияя на другие приложения и без других приложений, изменяющих ее значение.

UPDATE:

По умолчанию Gradle не копирует зависимости построить папку или включить его в банку. Существует три способа решения проблемы с зависимостями:

  1. Загрузите их отдельно и поместите в соответствующий каталог.
  2. Используйте плагины для сборки жирная баночка. Что-то вроде shadow.
  3. Добавить в build.gradle задачу, которая копирует зависимости в папку сборки.

Например

task copyDependencies(type: Copy) { 
    into "$buildDir/libs" 
    from configurations.runtime 
} 
+0

Привет, Thanx. можете ли вы привести конкретный пример? Теперь я делаю 'java -jar test-0.1.0.jar'. Должно быть это 'java -classpath. -jar build \ libs \ test-0.1.0.jar'? –

+0

Да, если все банки зависимостей находятся в одной папке. –

+0

Извините, но это не сработает. –