1

grails プロジェクトでは、リファレンス ドキュメントhttp://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositoriesに従って、カスタム アイビー リゾルバーを追加しました。

ただし、このリゾルバーには jsch とその他の jar が必要です。アイビーがそれらを使用するように、プロジェクトのビルドクラスパスに配置するにはどうすればよいですか?

これは私のBuildConfig.groovyです

grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.war.file = "target/${appName}-${appVersion}.war"

//Configure resolver
def sshResolver = new org.apache.ivy.plugins.resolver.SshResolver()
['libraries', 'builds'].each {
    sshResolver.addArtifactPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
    sshResolver.addIvyPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
}
sshResolver.name = "ssh"
sshResolver.settings = ivySettings

resolver sshResolver

grails.project.dependency.resolution = {
    // inherit Grails' default dependencies
    inherits("global") {
    }
    log "warn" 
    repositories {
        grailsPlugins()
        grailsHome()
        grailsCentral()
        ssh()
    }
    dependencies {
        compile 'someorg:somejar:1.0'
        runtime 'mysql:mysql-connector-java:5.1.13'
    }   
}
4

4 に答える 4

0

私は同じ問題を抱えていて、GrailsユーザーリストのIanRobertsからこの回答を得ました。

def myCL = new URLClassLoader([new File(
            "${basedir}/lib/the.jar"
        ).toURI().toURL()] as URL[],
        org.apache.ivy.plugins.repository.AbstractRepository.classLoader)
resolver myCL.loadClass('com.whatever.MyResolver').newInstance()

Ivyをロードしたクラスローダーを親として渡すことは、Ivyクラスを解決できるようにするために重要です。

複数のjarをロードする必要がある場合(ロードするクラスはそれらに依存するため)、次のようにすべてのファイルをリストに入れます。

def myCL = new URLClassLoader([
        "${basedir}/lib/jar1",
        "${basedir}/lib/jar2", // etc.
    ].collect { new File(it).toURI().toURL() } as URL[],
    org.apache.ivy.plugins.repository.AbstractRepository.classLoader)
resolver myCL.loadClass('com.whatever.MyResolver').newInstance()
于 2011-06-14T16:15:06.370 に答える
0

機能すると思われる別のオプションは、@Grabを使用することです。何かのようなもの:

@Grab(group="com.jcraft",module="jsch",version="0.1.42")
import org.apache.ivy.plugins.resolver.SshResolver

def sshResolver = new SshResolver()
['libraries', 'builds'].each {
    sshResolver.addArtifactPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
    sshResolver.addIvyPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
}
sshResolver.name = "ssh"
sshResolver.settings = ivySettings

resolver sshResolver

jar がパブリック リポジトリにない場合は、少し複雑になる可能性があります。

于 2011-06-16T00:49:49.447 に答える
-1

Grails は、ivy を使用してその依存関係管理を実装します。必要な追加ライブラリを宣言するだけです。次のようなことを試しましたか:

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   
于 2010-10-22T19:14:19.073 に答える
-2

どうやら

grails -cp ./lib/jsch.jar 

私が最初に試した -classpath または --classpath ではなく、答えでした。

誰かがより良い答えを持っている場合、私は確かにそれを受け入れます。

jar を grails/lib に配置しようとしましたが、リゾルバーが処理された後に読み込まれます。

PreInit.groovy でこれを試しましたが、運もありませんでした。

grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') } 
于 2010-10-22T20:12:08.980 に答える