Как исправить "несовместимую родную библиотеку JNA" при использовании Putty, Gradle и плагина Gradle Git?

У меня есть эта простая сборка script:

import org.ajoberstar.grgit.Grgit
apply plugin: 'application'
apply plugin: 'org.ajoberstar.release-opinion'
task wrapper(type:Wrapper) {
 gradleVersion = '2.1'
}
buildscript {
 repositories {
 mavenCentral()
 }
 dependencies {
 classpath 'org.ajoberstar:gradle-git:0.11.+'
 }
}
release {
 grgit = Grgit.open(project.file('.'))
}

Я создал проект стиля HelloWorld и инициализировал репозиторий git. Когда я использую каталог для удаленного источника, я могу запустить

.\gradlew.bat release

просто отлично. Но когда я использую цель ssh для удаленного источника, я получаю следующий вывод:

16:39:55.355 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':prepare'.
16:39:55.355 [INFO] [org.gradle.api.Task] Fetching changes from remote: origin
16:39:55.387 [INFO] [org.ajoberstar.grgit.auth.TransportOpUtil] The following authentication options are allowed (though they may not be available): [
HARDCODED, PAGEANT, SSHAGENT, INTERACTIVE]
16:39:55.402 [INFO] [org.ajoberstar.grgit.auth.TransportOpUtil] using interactive credentials, if needed
16:39:55.480 [INFO] [org.ajoberstar.grgit.auth.JschAgentProxySessionFactory] ssh-agent not available
16:39:55.511 [INFO] [org.ajoberstar.grgit.auth.JschAgentProxySessionFactory] pageant available
16:39:55.527 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':prepare'
16:39:55.527 [LIFECYCLE] [class org.gradle.TaskExecutionLogger] :prepare FAILED
16:39:55.543 [INFO] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] :prepare (Thread[main,5,main]) completed. Took 0.219 secs.
16:39:55.543 [DEBUG] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] Task worker [Thread[main,5,main]] finished, busy: 0.219 secs, idle: 0.0
 secs
16:39:55.543 [ERROR] [org.gradle.BuildExceptionReporter]
16:39:55.543 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
16:39:55.543 [ERROR] [org.gradle.BuildExceptionReporter]
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] Execution failed for task ':prepare'.
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] >
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter]
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] There is an incompatible JNA native library installed on this system.
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] To resolve this issue you may do one of the following:
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] - remove or uninstall the offending library
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] - set the system property jna.nosys=true
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] - set jna.boot.library.path to include the path to the version of the
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter] jnidispatch library included with the JNA jar file you are using
16:39:55.558 [ERROR] [org.gradle.BuildExceptionReporter]
16:39:55.574 [ERROR] [org.gradle.BuildExceptionReporter]
16:39:55.574 [ERROR] [org.gradle.BuildExceptionReporter] * Try:
16:39:55.574 [ERROR] [org.gradle.BuildExceptionReporter] Run with --stacktrace option to get the stack trace.
16:39:55.574 [LIFECYCLE] [org.gradle.BuildResultLogger]
16:39:55.574 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED

Я повторяюсь с --stacktrace, и вот фрагмент частичного стека для этой ошибки (кажется, подразумевает Jsch):

Caused by: java.lang.Error:
 at com.sun.jna.Native.<clinit>(Native.java:142)
 at com.jcraft.jsch.agentproxy.connector.PageantConnector$User32.<clinit>(PageantConnector.java:85)
 at com.jcraft.jsch.agentproxy.connector.PageantConnector.<init>(PageantConnector.java:61)
 at org.ajoberstar.grgit.auth.JschAgentProxySessionFactory$_closure2.doCall(JschAgentProxySessionFactory.groovy:122)
 at org.ajoberstar.grgit.auth.JschAgentProxySessionFactory$_closure2.doCall(JschAgentProxySessionFactory.groovy)
 at org.ajoberstar.grgit.auth.JschAgentProxySessionFactory$_determineConnector_closure5.doCall(JschAgentProxySessionFactory.groovy:86)
 at org.ajoberstar.grgit.auth.JschAgentProxySessionFactory.determineConnector(JschAgentProxySessionFactory.groovy:85)
 at org.ajoberstar.grgit.auth.JschAgentProxySessionFactory.getJSch(JschAgentProxySessionFactory.groovy:65)
 at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:191)
 at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:150)
 at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:109)
 at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121)
 at org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init>(TransportGitSsh.java:306)
 at org.eclipse.jgit.transport.TransportGitSsh.openPush(TransportGitSsh.java:152)
 at org.eclipse.jgit.transport.PushProcess.execute(PushProcess.java:154)
 at org.eclipse.jgit.transport.Transport.push(Transport.java:1173)
 at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:156)
 at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:79)
 at java_util_concurrent_Callable$call$0.call(Unknown Source)
 at org.ajoberstar.grgit.operation.PushOp.call(PushOp.groovy:104)
 at org.ajoberstar.grgit.operation.PushOp.call(PushOp.groovy)
 at java_util_concurrent_Callable$call.call(Unknown Source)
 at java_util_concurrent_Callable$call.call(Unknown Source)
 at org.ajoberstar.grgit.util.OpSyntaxUtil.tryOp(OpSyntaxUtil.groovy:45)
 at org.ajoberstar.grgit.Grgit.methodMissing(Grgit.groovy:190)
 at org.ajoberstar.gradle.git.release.GrgitReleasePlugin$_addReleaseTask_closure4_closure14.doCall(GrgitReleasePlugin.groovy:134)
 ... 56 more
</init></init></clinit></clinit>

Любые идеи о том, как это сделать?

Я использую Gradle 2.1, Gradle - git 0.11.0 (как вы можете видеть в сборке script), Java 1.7.0_71 64-bit (есть и другие версии Java на система, но для этой версии установлен PATH, а java -version выводит 1.7.0_71 64 бит), Putty 0.60 и git 1.9.0 msysgit.

1 ответ

Некоторые возможные причины для этого:

  • В Gradle была ошибка, по которой "w141 > -side JNA" просочилась "в другие места, см. https://issues.gradle.org/browse/GRADLE-3288, однако в основном это было в RC-версиях Gradle 2.4
  • У меня был один случай, когда я передавал системные свойства от Gradle до unit test через

    test {  systemProperties = System.properties  }

Это приводит к Gradle передаче свойств JNA-системы на unit test. Это было решено для меня следующим:

test {
 systemProperties = System.properties
 systemProperties['jna.boot.library.path'] = null
}

licensed under cc by-sa 3.0 with attribution.