1

今日、.ivy キャッシュをクリアし、プロジェクトの出力ターゲットをクリーンアップしました。それ以来、SBT でテストを実行したり、Scala IDE で編集したりすると、非常に奇妙な動作をするようになりました。

以下を考えると:

package com.abc.rest

import com.abc.utility.IdTLabel

次のエラーが表示されます。

object utility is not a member of package com.abc.rest.com.abc

が 2 回繰り返されていることに注意してくださいcom.abc。つまり、コンパイラはインポートを実行するときに現在のパッケージのコンテキストを使用しているように見えます (おそらくこれを実行するはずですが、これまで気付かなかった)。

また、パッケージcom.abc内のどこからでもcom.abc.rest(フル パスを使用しても) クラスにアクセスしようとすると、コンパイラは型が見つからないと文句を言います。

親パッケージのファイルを含めようとしたときにのみエラーが発生するようです。私が奇妙だと思うのは、私のコードが以前は機能していたことです。プロジェクトと ivy キャッシュをクリーンアップした後に発生し始めたので、新しいバージョンのコンパイラは以前のものよりも厳密になっている可能性があります。

私が間違っている可能性があること、またはこれをトラブルシューティングする方法についていくつかのアイデアが欲しいです。

アップデート:

最初に親クラスをインポートしてから現在のパッケージを定義することで、問題は解消されます。

import com.abc.utility.IdTLabel
import com.abs._

package com.abc.rest {
 // Define classes belonging to com.abc.rest here
}

したがって、これは機能しますが、なぜ逆に機能し、その後機能しなくなったのか、そしてどうすればそれを修正できるのかを知りたいです。よく見てみると、親パッケージ内のどこにも com という名前のパッケージ、オブジェクト、または特性が見つかりませんでした。

ワークシートに関する更新:

同じパッケージに属する Scala ワークシートは同じスコープを共有します。ワークシートはサンドボックス化されていません。ワークシートはプロジェクトを見ることができ、プロジェクトはワークシートを見ることができます。したがって、ワークシート ファイル内に作成するすべての「テスト」オブジェクト、特性、およびクラスは、プロジェクトの残りの部分でも表示されます。

私は非常に多くのワークシートを持っているので、どこで問題が発生したかを確認しようとさえしませんでした.それらをすべて独自のパッケージに移動しただけで、魔法のように問題はなくなりました.

したがって、その日の教訓は次のとおりです。ワークシート内に何かを作成すると、ワークシートの外からも見えるようになります。

とにかく、この新たに発見された知識は役に立ちます。つまり、「興味深い」ものはすべてワークシート内で構築、監視、微調整でき、プロジェクトの残りの部分は実際にそれを使用できます。実際にはかなりクールです。

sbt cleanアイビーのキャッシュをクリーンアップすることで、以前は隠されていた問題がどのように浮き彫りになったかを考えるのは興味深いことですが、それはまた別の話です....

4

2 に答える 2

3

(JacobusR の要請により、以前のコメントから適切な回答を作成しています)。

これは、 package 内で何らかのクラス/特性/オブジェクトを定義した場合に発生する可能性がありますcom.abc.rest.comcom.abc.rest.comパッケージが存在するとすぐに、あなたがパッケージcom.abc.restにいるとすれば、とは対照的にcom指定します。ソース ファイルをスキャンせずに確認する最も速い (ただし決定的ではない) 方法は、「c​​om/abc/rest/com」サブフォルダーで .class ファイルを探すことです。com.abc.rest.com_root_.com

特に、ファイルのいずれかにパッケージ定義が重複している場合 ( package のようにcom.abc.rest; package com.abc.rest; ...)、この動作が発生します。エラーが発生した同じファイルのどこかにこの重複パッケージ句がある場合、ファイルのコンパイルに失敗すると、クラスの .class ファイルの生成が妨げられるため、.class ファイルに怪しいものは何も表示されません。ファイル内の定義。

最後に役立つ情報として、scala ワークシートはサンドボックス化されておらず、ワークシートで定義した内容が (プロジェクトのコードがワークシートに影響を与えるだけではなく) プロジェクトのコードに影響を与えることがわかりました。そのため、ワークシートでパッケージ句が重複していると、エラーが発生する可能性が非常に高くなります。

于 2013-02-07T18:27:46.010 に答える
1

パッケージ名が競合する場合、そのためのカスタム エラー メッセージが表示されることがあります。から開始して、フル パスを指定することで問題が解決するかどうかを確認し__root__ます。元。import __root__.com.foo.bar._

于 2013-02-06T22:02:47.290 に答える