tutorial how create scala sbt scala-2.9 javap

scala - how - Agregue tools.jar en el classpath del proyecto sbt



scala cmd (2)

Respuesta larga, eso podría ayudarte en otra parte.

Si quiero saber algo sobre SBT, lo inspect :

> inspect console [info] Task: Unit [info] Description: [info] Starts the Scala interpreter with the project classes on the classpath. [info] Provided by: [info] {file:/home/dcs/github/anti-xml/}default-39679a/compile:console [info] Dependencies: [info] compile:compilers(for console) [info] compile:full-classpath [info] compile:scalac-options(for console) [info] compile:initial-commands(for console) [info] compile:streams(for console) [info] Delegates: [info] compile:console [info] *:console [info] {.}/compile:console [info] {.}/*:console [info] */compile:console [info] */*:console [info] Related: [info] test:console

Ok, hay una dependencia interesante en compile:full-classpath . Me gustaría que fuera compile:full-classpath(for console) , pero no lo es. Sin embargo, no debería causarme problemas en este caso. Vamos a inspect .

> inspect compile:full-classpath [info] Task: scala.collection.Seq[sbt.Attributed[java.io.File]] [info] Description: [info] The exported classpath, consisting of build products and unmanaged and managed, internal and external dependencies. [info] Provided by: [info] {file:/home/dcs/github/anti-xml/}default-39679a/compile:full-classpath [info] Dependencies: [info] compile:exported-products [info] compile:dependency-classpath [info] Reverse dependencies: [info] compile:console [info] Delegates: [info] compile:full-classpath [info] *:full-classpath [info] {.}/compile:full-classpath [info] {.}/*:full-classpath [info] */compile:full-classpath [info] */*:full-classpath [info] Related: [info] compile:full-classpath(for doc) [info] test:full-classpath [info] test:full-classpath(for doc) [info] *:full-classpath(for console) [info] runtime:full-classpath [info] compile:full-classpath(for console)

Ok, podría ir más allá en las dependencias, pero no creo que sea necesario. Veamos que hay dentro de él:

> show compile:full-classpath [warn] Credentials file /home/dcs/.ivy2/.credentials does not exist [info] List(Attributed(/home/dcs/github/anti-xml/target/scala-2.9.1/classes), Attributed(/home/dcs/.sbt/boot/scala-2.9.1/lib/scala-library.jar)) [success] Total time: 0 s, completed Dec 7, 2011 3:49:30 PM

Ok, no hay nada inesperado allí. Vamos a añadir tools.jar .

Para cambiar algo tengo que usar el set , y tengo que respetar un montón de fundas de camello y otras reglas para que funcione. Si tuviera que compile:full-classpath(for console) , se convertiría fullClasspath in Compile in console . Tenga en cuenta la mayúscula en Compile , y que full-classpath fullClasspath full-classpath convirtió en fullClasspath y la fullClasspath general de los nombres de los elementos. Detalles aquí .

Creo que uno debería ser capaz de tomar el resultado del show (o, al menos, inspect ) y devolverlo al set , pero ese no es el caso (por ahora, de todos modos), así que simplemente aprenda estas reglas de conversión.

No quiero volver a escribir todo, solo agregue un archivo JAR. Necesito usar += para eso. Los operadores utilizados para cambiar de cosa se pueden encontrar here .

El classpath parece necesitar algunas cosas Attributed . Verifique los documentos detallados en Classpath en el wiki de SBT y descubra cómo crear uno. Afortunadamente, la mayoría de los valores que quiero cambiar no son tan difíciles de crear como este.

> set fullClasspath in Compile += Attributed.blank(file("/usr/lib/jvm/java-6-sun-1.6.0.26/lib/tools.jar")) [info] Reapplying settings... [info] Set current project to anti-xml (in build file:/home/dcs/github/anti-xml/)

Parece haber funcionado. Vamos a show su contenido para confirmar, ya que incluso escribir compile lugar de Compile podría hacer que cambie algo incorrecto.

> show compile:full-classpath [warn] Credentials file /home/dcs/.ivy2/.credentials does not exist [info] List(Attributed(/home/dcs/github/anti-xml/target/scala-2.9.1/classes), Attributed(/home/dcs/.sbt/boot/scala-2.9.1/lib/scala-library.jar), Attributed(/usr/lib/jvm/java-6-sun-1.6.0.26/lib/tools.jar)) [success] Total time: 0 s, completed Dec 7, 2011 3:50:07 PM

Sí, ahí está. Vamos a probarlo:

> console [warn] Credentials file /home/dcs/.ivy2/.credentials does not exist [info] Starting scala interpreter... [info] import com.codecommit.antixml._ bookstore: com.codecommit.antixml.Elem = <bookstore><book><title>For Whom the Bell Tolls</title><author>Hemmingway</author></book><book><title>I, Robot</title><author>Isaac Asimov</author></book><book><title>Programming Scala</title><author>Dean Wampler</author><author>Alex Payne</author></book></bookstore> books: com.codecommit.antixml.Zipper[com.codecommit.antixml.Elem] = <book><title>For Whom the Bell Tolls</title><author>Hemmingway</author></book><book><title>I, Robot</title><author>Isaac Asimov</author></book><book><title>Programming Scala</title><author>Dean Wampler</author><author>Alex Payne</author></book> Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26). Type in expressions to have them evaluated. Type :help for more information. scala> :javap com.codecommit.antixml.Elem Compiled from "node.scala" public class com.codecommit.antixml.Elem extends java.lang.Object implements com.codecommit.antixml.Node,com.codecommit.antixml.Selectable,scala.ScalaObject,scala.Product,scala.Serializable{ public static final scala.Function1 tupled(); public static final scala.Function1 curry(); public static final scala.Function1 curried(); public static final boolean isValidName(java.lang.String); public scala.collection.Iterator productIterator(); public scala.collection.Iterator productElements(); public java.lang.Object $bslash(com.codecommit.antixml.Selector, com.codecommit.antixml.CanBuildFromWithZipper); public java.lang.Object $bslash$bslash(com.codecommit.antixml.Selector, com.codecommit.antixml.CanBuildFromWithZipper); public java.lang.Object $bslash$bslash$bang(com.codecommit.antixml.Selector, com.codecommit.antixml.CanBuildFromWithZipper); public java.lang.Object select(com.codecommit.antixml.Selector, com.codecommit.antixml.CanBuildFromWithZipper); public com.codecommit.antixml.Zipper toZipper(); public scala.Option prefix(); public java.lang.String name(); public com.codecommit.antixml.Attributes attrs(); public scala.collection.immutable.Map scope(); public com.codecommit.antixml.Group children(); public com.codecommit.antixml.Elem canonicalize(); public java.lang.String toString(); public com.codecommit.antixml.Group toGroup(); public com.codecommit.antixml.Group copy$default$5(); public scala.collection.immutable.Map copy$default$4(); public com.codecommit.antixml.Attributes copy$default$3(); public java.lang.String copy$default$2(); public scala.Option copy$default$1(); public com.codecommit.antixml.Elem copy(scala.Option, java.lang.String, com.codecommit.antixml.Attributes, scala.collection.immutable.Map, com.codecommit.antixml.Group); public int hashCode(); public boolean equals(java.lang.Object); public java.lang.String productPrefix(); public int productArity(); public java.lang.Object productElement(int); public boolean canEqual(java.lang.Object); public com.codecommit.antixml.Elem(scala.Option, java.lang.String, com.codecommit.antixml.Attributes, scala.collection.immutable.Map, com.codecommit.antixml.Group); }

¡¡¡Éxito!!!

Por supuesto, esta sesión es una mentira. Me tomó mucho más tiempo llegar allí, pero eso es sobre todo práctica.

El comando '': javap'' en la consola de scala 2.9.1 necesita tools.jar (de JDK6) en el ''classpath''. Desde cmd-line se podría hacer con el argumento ''-cp'' o la variable de entorno CLASSPATH.

¿Cómo hacer lo mismo para la consola scala que se invoca desde SBT con los comandos ''console'' y ''console-quick''?


https://github.com/ensime/ensime-server/blob/master/build.sbt#L35

// epic hack to get the tools.jar JDK dependency val JavaTools = List[Option[String]] ( // manual sys.env.get("JDK_HOME"), sys.env.get("JAVA_HOME"), // osx try Some("/usr/libexec/java_home".!!.trim) catch { case _: Throwable => None }, // fallback sys.props.get("java.home").map(new File(_).getParent), sys.props.get("java.home") ).flatten.map { n => new File(n + "/lib/tools.jar") }.find(_.exists).getOrElse ( throw new FileNotFoundException ( """Could not automatically find the JDK/lib/tools.jar. |You must explicitly set JDK_HOME or JAVA_HOME.""".stripMargin ) )