4

プロジェクトで tools.jar を使用する必要がありますが、ユーザーが既に持っているため、jar にパッケージ化する意味はあまりありません。それで、それを「動的依存関係」として使用することは可能ですか?つまり、自分ので見つかったファイルを使用してコードをコンパイルしたいのですが、それをパッケージ化したくありません。代わりにユーザーを使用して、実行時に二重のアクティブ化を使用してクラスパスに追加することを確認できます。例えば:tools.jar JAVA_HOME JAVA_HOME

object Main1 extends App {
    val myjar = Main1.getClass.getProtectionDomain.getCodeSource.getLocation.getFile
    val tools = System.getProperty("java.home").dropRight(3)+"lib/tools.jar" // drop "jre"
    val arguments = Array("java", "-cp", myjar+":"+tools, "me.myapp.Main2") ++ args
    val p = Runtime.getRuntime.exec(arguments)
    p.getErrorStream.close
    p.getOutputStream.close
}

参考までに、アセンブリ プラグインを使用してアプリをスタンドアロンの jar ファイルにパッケージ化します。

編集:

醜い解決策は、tools.jarファイルをプロジェクトの lib ディレクトリにコピーし、次を追加することです。

excludedJars in assembly <<= (fullClasspath in assembly) map { cp => 
    cp filter {_.data.getName == "tools.jar"}
}

jarファイルをコピーせずに、よりエレガントに行うことがbuild.sbt できますか? tools.jarJVMを切り替えて、「正しい」ファイルを自動的に使用する方がはるかに簡単です...

4

3 に答える 3

6

SBT Documentationをより注意深く読んだ後、これを行う方法を見つけました:
build.sbt追加する必要がありました:

// adding the tools.jar to the unmanaged-jars seq
unmanagedJars in Compile ~= {uj => 
    Seq(Attributed.blank(file(System.getProperty("java.home").dropRight(3)+"lib/tools.jar"))) ++ uj
}

// exluding the tools.jar file from the build
excludedJars in assembly <<= (fullClasspath in assembly) map { cp => 
    cp filter {_.data.getName == "tools.jar"}
}

それだけです...簡単です:)

于 2012-09-20T07:48:32.580 に答える
2

これを行うための sbt プラグインがあります: https://github.com/chipsenkbeil/sbt-jdi-tools

于 2017-10-13T13:08:23.870 に答える
-1

私はこれをテストしていませんが、% 構成構文を使用して依存関係をランタイムまたはコンパイルにマップすることはできませんか? とにかくtools.jarは自動的に含まれるべきですか?

libraryDependencies += "com.sun" % "tools" % "1.6.0" % system

「システム」構成についてはわかりません。これがmavenで機能することはわかっていますが、代わりに「コンパイル」でこれを試すことができます。

于 2012-09-14T13:18:16.087 に答える