3

次のように、jar ファイル以外のものへの依存関係を作成できます。

dependencies {
    compile files("../other-project/config.txt")
}

config.txt が war ファイルの WEB-INF/lib フォルダーに配置されることを除いて、上記は正常に機能します。代わりに、war ファイルの WEB-INF/classes と、jettyRun の src/main/resources にある必要があります。

依存関係がどこで終わるかを制御するにはどうすればよいですか? それとも、これについて間違った方法で行っていますか?

これはコピー タスクでも解決できますが、変更しない限りファイルを更新する必要がないという点で、これは実際には依存関係です。無条件のコピーは機能しますが、私はこれを正しい方法で行いたいと考えています。

4

3 に答える 3

1

warタスク(プラグインによって構成されている)warは、依存関係をWEB-INF/libに、Webプロジェクト自体のコード/リソースをWEB-INF/classesに、Webアプリのコンテンツ(デフォルトではsrc/main/webapp)をに配置しWEB-INFます。タスクを明示的に構成することにより、他のコンテンツを追加できwarます。例えば:

war {
    into("WEB-INF/classes") {
        from "../other-project/config.txt"
    }
}

埋め込まれたJettyでこれを機能させる1つの方法(開発中はおそらく最も便利ではありませんが)は、jettyRunWarの代わりにを使用することですjettyRun。特に追加するコンテンツが独自のディレクトリにある場合に頭に浮かぶ別の解決策は、そのディレクトリをWebプロジェクトの追加のリソースディレクトリとして宣言することです(sourceSets.main.resources.srcDir "../other-project/someResourceDir")。warこれは、実際にはタスクを構成するための代替手段です。Webプロジェクトがすでに他のプロジェクトに依存している場合は、代わりにそのプロジェクトの追加のリソースディレクトリを構成できます。

于 2013-02-23T01:31:36.120 に答える
1

次のディレクトリとファイル構造でマルチプロジェクト ビルドを構成したとします。

/combined-war
    /main-project
        /src
            /webapp
                /WEB-INF
                    web.xml
        build.gradle
    /other-project
        /resources
            /WEB-INF
                /classes
                    config.txt
        build.gradle
    build.gradle

のディレクトリの内容を のディレクトリjettyRunの内容と結合できるようにするには、 ofに回避策を追加する必要があります(ユーザーsiasia が gist に投稿したものを適応させました)。webappmain-projectresourcesother-projectbuild.gradlemain-project

同じディレクトリの内容を war ファイルに追加するのは非常に簡単で、Gradle ユーザー ガイドDSL リファレンスに記載されています。

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'jetty'

import org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext

def newResourceCollection(File... resources) {
    def script = '''
        import org.mortbay.resource.ResourceCollection
        new ResourceCollection(resources)
    '''

    def shell = new GroovyShell(JettyPluginWebAppContext.class.classLoader)
    shell.setProperty("resources", resources as String[])
    return shell.evaluate(script)
}

jettyRun.doFirst {
    jettyRun.webAppConfig = new JettyPluginWebAppContext()
    jettyRun.webAppConfig.baseResource = newResourceCollection(
        // list the folders that should be combined
        file(webAppDirName),
        file("${project(':other-project').projectDir}/resources")
    )
}

war {
    from("${project(':other-project').projectDir}/resources")
}

実行するたびに、指定されたディレクトリを組み合わせgradle jettyRunた新しいディレクトリが作成されます。ResourceCollectionデフォルトでは、Jetty は提供しているすべてのファイルを (少なくとも Windows では) ロックします。したがって、Jetty の実行中にこれらのファイルを編集する場合は、次の解決策をご覧ください。

アップデート

other-projectこの場合、別の Gradle プロジェクトではないため、2 つのタスクは次のbuild.gradleようになります。

jettyRun.doFirst {
    jettyRun.webAppConfig = new JettyPluginWebAppContext()
    jettyRun.webAppConfig.baseResource = newResourceCollection(
        file(webAppDirName),
        file("$projectDir/../other-project/resources")
    )
}

war {
    from("$projectDir/../other-project/resources")
}

ファイルを1つだけ追加するソリューションを知りません(例: config.txt)。常に完全なディレクトリを追加する必要があります。

于 2013-02-23T00:48:36.960 に答える
0

上で述べたように、問題を解決する無条件のコピーを実行するのは簡単です。繰り返しますが、私が最初に尋ねた質問ではありません。しかし、戦争と j​​ettyRun タスクの両方で機能する私のソリューションは次のとおりです。

processResources.doFirst {
    copy {
        from '../other-project/config.txt'
        into 'src/main/resources'
    }
}
于 2013-02-23T17:11:48.437 に答える