3

背景: 私は Play 2.0 プロジェクトを持っており、いくつかのクラス (Java) で jar 内のアスペクトを使用してアスペクト織りを行うために何かを追加しようとしています。(sbt-aspectj ではそれができないか、方法がわかりません)。そのため、カスタム タスクを追加して、コンパイルに依存させる必要があります。私は依存関係の部分をある程度理解しました。しかし、自分が何をしているのか正確にはわからないので、これを IDE を使用して開発したいと考えています (私は Scala-IDE を使用しています)。sbt プロジェクト (したがって Play プロジェクト) は再帰的に定義されるため、次のことができると仮定しました。

  1. Eclipse プラグインを myplay/project/project/plugins.sbt に追加します。
  2. myplay/project/project/build.sbt に sbt メイン jar (および aspectj jar) を追加します。

    libraryDependencies ++= Seq( "org.scala-sbt" % "main" % "0.12.2", "aspectj" % "aspectj-tools" % "1.0.6" )

  3. myplay/project にドロップ

  4. sbt を実行し、Eclipse タスクを実行してから、プロジェクトを別のプロジェクトとして Eclipse にインポートします。

これは可能ですが、build.scala (およびその他の scala ファイル) は最初はソースと見なされず、ビルド パスを少しいじる必要があります。ただし、プロジェクト用に sbt main を定義したにもかかわらず、Eclipse IDE とコンパイル タスクの両方でエラーが発生します。

> compile
[error] .../myplay/project/Build.scala:2: not found: object keys
[error] import keys.Keys._
[error]        ^
[error] .../myplay/project/SbtAspectJ.scala:2: object Configurations is not a member of package sbt
[error] import sbt.Configurations.Compile
[error]            ^
[error] .../myplay/project/SbtAspectJ.scala:3: object Keys is not a member of package sbt
[error] import sbt.Keys._
[error]            ^
[error] three errors found

Eclipse プロジェクトは、その参照ライブラリーにメイン・ツールもアスペクトツールも示していません。ただし、偽のバージョン (0.12.4 など) を指定すると、リロードが失敗するため、依存関係を使用しているように見えます。

だから、... 最初に: これはこれを行う適切な方法ですか? 2番目: もしそうなら、なぜライブラリが追加されないのですか? (3番目:これを私が見逃したばかげたものにしないでください。)

4

2 に答える 2

7

エラーが発生した場合object Keys is not a member of package sbtは、/project ディレクトリではなく、ベース ディレクトリから sbt を実行していることを確認する必要があります。

于 2013-06-26T18:51:44.370 に答える
1

sbt-aspectj

sbt-aspectj ではそれができないようです。または、方法がわかりません。

これが本当の問題だと思います。動作するプラグインが既にあるので、ビルドをいじるのではなく、それを動作させてみてください。build.scala のプラグインを使用するのは少しトリッキーです。幸いなことに、githubにサンプル プロジェクトがあります。

import sbt._
import sbt.Keys._
import com.typesafe.sbt.SbtAspectj.{ Aspectj, aspectjSettings, compiledClasses }
import com.typesafe.sbt.SbtAspectj.AspectjKeys.{ binaries, compileOnly, inputs, lintProperties }


object SampleBuild extends Build {
  ....

  // precompiled aspects
  lazy val tracer = Project(
    "tracer",
    file("tracer"),
    settings = buildSettings ++ aspectjSettings ++ Seq(
      // stop after compiling the aspects (no weaving)
      compileOnly in Aspectj := true,

      // ignore warnings (we don't have the sample classes)
      lintProperties in Aspectj += "invalidAbsoluteTypeName = ignore",

      // replace regular products with compiled aspects
      products in Compile <<= products in Aspectj
    )
  )
}

SBT プロジェクト自体をどのように開発しますか?

ビルドのハッキングに興味がある場合は、最初に入門ガイドを参照してください。具体的には、質問は.scala Build Definition pageで回答する必要があります。

ビルドで を利用したいと思います"aspectj" % "aspectj-tools" % "1.0.6"。もしそうなら、それはに含まれるべきでmyplay/project/plugins.sbtあり、あなたのコードはmyplay/project/common.scala何かに入る必要があります。IDE を使用したい場合は、sbt プラグインとしてビルドするとうまくいくでしょう。そうすれば、コードはsrc/main/scala. sbt プラグイン構造の例については、sbt/sbt-aspectj または sbt/sbt-assembly を確認してください。

于 2013-09-01T04:42:51.847 に答える