2011-12-07 8 views
18

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

¿Cómo hacer lo mismo para la consola scala que invocó desde SBT con los comandos 'consola' y 'consola rápida'?

Respuesta

31

Respuesta larga, que podría ser útil en otro lugar.

Si quiero saber sobre algo en SBT, lo que 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 interesantes de compile:full-classpath. Desearí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 qué hay dentro:

> 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, nada inesperado allí. Agreguemos tools.jar.

Para cambiar algo tengo que usar set, y tengo que respetar una gran cantidad de cajas de camello y otras reglas para que funcione. Si tuviera compile:full-classpath(for console), se convertiría en fullClasspath in Compile in console. Tenga en cuenta la mayúscula en Compile, y que full-classpath se convirtió en fullClasspath, y el reordenamiento general de los nombres de los elementos. Details here.

creo que uno debe ser capaz de tomar la salida de show (o, al menos, inspect) y alimentarla de vuelta a set, pero ese no es el caso (por ahora, de todos modos), por lo que sólo aprender estas reglas conversiones .

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

El classpath parece necesitar algunas cosas Attributed. Consulte los documentos detallados en Classpath en el wiki de SBT y descubra cómo crear uno. Afortunadamente, la mayoría de los valores que deseo 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 que funcionó. Vamos a show su contenido para confirmar, ya que incluso escribir compile en lugar de Compile podría hacer que cambie la cosa incorrecta.

> 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í, allí 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 llevó mucho más llegar allí, pero eso es principalmente práctica.

+0

Gracias, Daniel, por respuesta detallada. Con –

+0

SBT 0.12.0 me sale: $ consola SBT Scala> establece fullClasspath en Compilar + = Attributed.blank (archivo ("/ usr/lib/jvm/jdk1.7.0/lib/tools.jar")) : 1: error: ';' esperado, pero '.' encontró. establecer fullClasspath en Compile + = Attributed.blank (file ("/ usr/lib/jvm/jdk1.7.0/lib/tools.jar")) –

+1

No estoy seguro de qué versión de SBT sucedió, pero ahora la dependencia es 'compilar: console :: fullClasspath' como lo deseaba. 'fullClasspath en la compilación en la consola' funciona. –

6

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 
) 
) 
Cuestiones relacionadas