sbt-android:无法在android上使用scala-reflect:找不到java.rmi.Remote(sbt-android: unable to use scala-reflect on android: java.rmi.Remote not found)
我正在尝试使用scala-reflect软件包进行android开发。 我在build.sbt中添加了scala-reflect依赖项:
libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.11.8"
但我得到一个例外:
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/rmi/Remote;
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass$lzycompute(Definitions.scala:370)
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass(Definitions.scala:370)
at scala.reflect.runtime.JavaUniverseForce$class.force(JavaUniverseForce.scala:255)
at scala.reflect.runtime.JavaUniverse.force(JavaUniverse.scala:16)
at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:147)
at scala.reflect.runtime.JavaUniverse.(JavaUniverse.scala:78)
at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
at scala.reflect.runtime.package$.universe(package.scala:17)
我试图添加java.rmi.Remote和java.rmi.RemoteException的java源代码并使用android:package --core-library构建项目(因为sbt没有找到dexCoreLibrary选项),它构建成功,但我得到了运行时错误。
那么,是否可以添加java.rmi依赖,否则scala.reflect可以使用它?
我在方法Option.orDefault的实现上下文中使用scala.reflect库:
class RichOption[+A : TypeTag](val delegate: Option[A]) {
def orDefault : A = delegate.getOrElse {
delegate match {
case t if typeOf[A] <: typeof> 0.asInstanceOf
case _ => throw new IllegalAccessException("there is no default value for this type.")
}
}
}
如果您知道Option.orDefault的更好实现(可能没有scala.reflect),请告诉我。
I'm trying to use the scala-reflect package for android development. I have added the scala-reflect dependency in my build.sbt:
libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.11.8"
but I get an exception:
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/rmi/Remote;
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass$lzycompute(Definitions.scala:370)
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass(Definitions.scala:370)
at scala.reflect.runtime.JavaUniverseForce$class.force(JavaUniverseForce.scala:255)
at scala.reflect.runtime.JavaUniverse.force(JavaUniverse.scala:16)
at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:147)
at scala.reflect.runtime.JavaUniverse.(JavaUniverse.scala:78)
at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
at scala.reflect.runtime.package$.universe(package.scala:17)
I have tried to add the java source of java.rmi.Remote and java.rmi.RemoteException and built the project with android:package --core-library (because sbt has not found the dexCoreLibrary option) , it builded successfully, but I got the runtime error.
So, is it possible to add the java.rmi dependency otherwise, that scala.reflect can use it?
I'm using the scala.reflect library in the context of an implementation of a method Option.orDefault:
class RichOption[+A : TypeTag](val delegate: Option[A]) {
def orDefault : A = delegate.getOrElse {
delegate match {
case t if typeOf[A] <: typeof> 0.asInstanceOf
case _ => throw new IllegalAccessException("there is no default value for this type.")
}
}
}
If you know a better implementation for Option.orDefault (possibly without scala.reflect), please let me know.
原文:https://stackoverflow.com/questions/40359503
更新时间:2020-02-16 12:15
最满意答案
好多了:
case class Default[A](value: A)
object Default {
implicit val intDefault: Default[Int] = Default(0)
// other Default implementations
}
class RichOption[+A](val delegate: Option[A])(implicit d: Default[A]) {
def orDefault : A = delegate.getOrElse(d.value)
}
如果与没有定义默认值,没有复杂匹配,不需要大依赖关系等的类型一起使用,则会出现编译错误而不是运行时错误。
Much better:
case class Default[A](value: A)
object Default {
implicit val intDefault: Default[Int] = Default(0)
// other Default implementations
}
class RichOption[+A](val delegate: Option[A])(implicit d: Default[A]) {
def orDefault : A = delegate.getOrElse(d.value)
}
You get a compilation error instead of a runtime error if used with a type which doesn't have a defined default value, no complex matching, no need for a large dependency, etc.
2016-11-01
相关问答
libraryDependencies += "com.android.support" % "appcompat-v7" % "23.1.1"
并且不要忘记在SDK管理器中安装android支持库 如果你设置了resolvers := ()你也不能解决依赖关系resolvers := () libraryDependencies += "com.android.support" % "appcompat-v7" % "23.1.1"
And don't forget to install
...
我遇到了同样的问题,试图在我的Android应用程序中使用DigestUtils。 这是我可以通过搜索找到的最好的答案,但是我不愿意重命名更改名称空间的.jar文件。 在这个问题上度过了一段时间后,我发现了一个更简单的方法来解决我的问题。 我的代码的问题陈述是 String s = DigestUtils.md5Hex(data);
将此语句替换为以下内容,它将工作: String s = new String(Hex.encodeHex(DigestUtils.md5(data)));
同样
...
找到解决方案! 答案在这里: https : //github.com/aemoncannon/ensime/issues/184#issuecomment-2038002 : .bashrc中的环境变量仅对在bash中运行或从bash启动的程序有效,否则您将需要.profile。 如果你正在使用emacs:你可以使用Mx getenv来查看emacs是否可以看到环境变量。 在.emacs中使用(setenv“ANDROID_SDK_HOME”“〜/ _dev / _android / andro
...
sbt使用Scala的一个副本,它会自动下载 - 它会自动下载“正确”的版本 - 所以不需要搞乱你自己安装的Scala。 因为这是一个sbt插件,所以需要在project/build.properties中将sbt版本更改为它所期望的版本(如果该文件不存在,则可以使用以下内容创建它): sbt.version=0.12.0
确保你reload sbt,以便新的(旧)版本的sbt被加载。 或者,当然,你可以尝试从sbt 0.13源代码编译sbt-android-plugin ,通过做相反的操作(你
...
如果您的按钮位于fragment_main.xml (而不是activity_main.xml )中,那么您需要将setOnClickListener逻辑移动到片段类中。 /**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
Button ofertasbutton;
public Placeho
...
这是Intellij中的一个已知问题 您可以切换到IDEA中的夜间scala插件,也可以下载此文件并替换本地副本 It is a known issue in Intellij You can either switch to the nightly scala plugin in IDEA or download this file and replace your local copy
删除project.properties对actionbarsherlock的引用。 actionbarsherlock项目是自动构建的,因为它位于project.properties ,因为您添加了一个手动子项目,所以它是重复的。 如果你从未在actionbarsherlock项目中设置所有sbt项目,那么一切都会有效。 鉴于您确实设置了它,您没有正确使用androidBuildWith函数用于依赖项目。 从根项目中删除androidBuild行并将根项目更改为project.in(file("
...
好多了: case class Default[A](value: A)
object Default {
implicit val intDefault: Default[Int] = Default(0)
// other Default implementations
}
class RichOption[+A](val delegate: Option[A])(implicit d: Default[A]) {
def orDefault : A = delegate.get
...
最后,我放弃了尝试让编译器理解其他库。 最后,我将使用sbt可用的依赖项添加到sbt托管库中。 这显然效果很好。 In the end, I gave up on trying to get the compiler to understand the additional libraries. Eventually, I added those dependencies that were available using sbt, to the sbt managed libraries. Th
...
由于@laughedelic的问题在这里猜测。 build.sbt应该在根目录中。 假设你正在编写的项目是test-sbt ,你应该得到类似于以下结构的结构: test-sbt/build.sbt
test-sbt/project
否则build.sbt用于创建SBT使用的“内部编译项目”。 可以在SBT的文档中找到更深层次的解释, sbt是递归的 。 Guessing here due the question by @laughedelic. The build.sbt should b
...