2013-09-03 8 views
7

Sto provando a chiamare le librerie Java Selenium da Scala. Sto usando Scala IDE (Eclipse) e Scala 2.10.2. Qual è la causa di questo errore del compilatore?Errore di Scala: file di classe non funzionante, indice di biliardo costante errato

error while loading Function, class file '/Dev/selenium-2.35.0/libs/guava- 
14.0.jar(com/google/common/base/Function.class)' is broken 
(class java.lang.RuntimeException/bad constant pool index: 0 at pos: 479) 

A volte mi correggere errori di file di classe rotti includendo più barattoli - vasetti che javac non avrebbe bisogno di vedere, ma a quanto pare scalac fa. Ma in questo caso non so quali altri barattoli posso aggiungere.

+0

possibilmente correlate ? https://issues.scala-lang.org/browse/SI-7002 – DaoWen

+0

Ho appena provato un paio di altri file jar - senza fortuna. Sembra improbabile che siano stati tutti compilati con Eclipse. Vedrò se riesco a ottenere il codice sorgente e compilarlo manualmente. –

risposta

4

La risposta di RobN è corretta, ma ho pensato di scrivere una risposta un po 'più lunga con le mie esperienze. Questo è relativo a e discussioni su Guava problemi 776 e 1095 menzionati da RobN.

Ho avuto questo stesso problema cercando di accedere

com.google.common.io.BaseEncoding.base64() 

Eclipse sostiene il membro Base64 non esiste e Gradle costruire produce l'errore nella domanda:

[ant:scalac] error: error while loading BaseEncoding, class file 
    '.../guava-16.0.jar(com/google/common/io/BaseEncoding.class)' is broken 

L'errore è causato da dipendenza opzionale su alcune annotazioni in Guava's pom.xml. Come spiegato in this answer, il compilatore Java ignora le annotazioni per le quali non viene trovato il corrispondente file di classe, ma il compilatore Scala richiede la compilazione delle definizioni.

L'aggiunta esplicita della dipendenza facoltativa dovrebbe risolvere il problema.

In questo caso particolare Guava's pom.xml ha seguito dipendenza opzionale e aggiungendo le dichiarazioni di dipendenza seguito al progetto risolverà il problema:

Gradle:

compile 'com.google.code.findbugs:jsr305:2.0.2' 

Maven:

<dependency> 
<groupId>com.google.code.findbugs</groupId> 
<artifactId>jsr305</artifactId> 
<version>2.0.2</version> 
</dependency> 
+0

Penso che questo sia lo stesso della mia risposta di 5 mesi fa, anche se la spiegazione su Scala è contenuta nel link. –

+2

@RobN Sì. Ho fatto un po 'di googling per arrivare qui. Originariamente ho trovato il post nel link. Dopo aver conosciuto le parole chiave giuste ho cercato di nuovo SO e ho trovato questa domanda. Spero che elaborando un po 'e collegando le domande ai futuri esploratori, i risultati saranno più veloci. Non sono sicuro se questo è un buon modo per procedere su SO anche se ... –

+0

Nel mio caso equivalente l'errore iniziale è: 'errore durante il caricamento di GoogleService, file di classe '..../lib/gdata-core-1.0 .jar (com/google/gdata/client/GoogleService.class) "è rotto". Quel [pacchetto java] (https://code.google.com/p/gdata-java-client/source/checkout) dipende da Guava. In qualche modo non riesco a riprodurre la soluzione con sbt usando 'libraryDependencies + =" com.google.code.findbugs "%" jsr305 "%" 2.0.2 "' anche se ho già avuto quel jar nel mio classpath ('/ lib') innanzitutto. Qualche idea? – matanster

Problemi correlati