2015-03-13 20 views
7

Ho un progetto che raccoglie le dipendenze per un programma di installazione (sbt-install4j) utilizzando dependencyClasspath. Funziona maggior parte del tempo, tranne quando ho una dipendenza specifica:Dipendenza mancante dal classpath

libraryDependencies += "org.bytedeco" % "javacpp" % "0.10" 

"javacpp" non verrà aggiunto alla dependencyClasspath. È possibile creare un progetto semplice SBT solo con la dipendenza sopra e tenta show dependencyClasspath, verrà stampata:

[info] List(Attributed(C:\Users\me\.sbt\boot\scala-2.10.4\lib\scala-library.jar)) 

non c'è "javacpp". Qualsiasi indizio che cosa potrebbe accadere? Si tratta di un bug SBT?

+1

Lo fa anche con 'classpathTypes + =" maven-plugin "'? –

+0

Sì. aggiungendo 'classpathTypes + =" maven-plugin "' aggiunge dipendenza al classpath. Grazie per averlo indicato. Diventa un po 'noioso nei progetti multi-modulo. Ad esempio, il modulo 'B' dipende da' A' e 'A' dipende da javacpp. 'A' ha' classpathTypes ... ', il modulo' B' dovrà aggiungere anche 'classpathTypes ...'. Il mio problema originale era con il progetto multi-modulo. La tua correzione funziona lì, ma deve essere aggiunta anche al modulo principale. – Jarek

+0

Mi chiedo perché dobbiamo dire a SBT di caricare i plug-in Maven in modo esplicito? Potremmo anche risolvere il problema suddividendo l'artefatto in due, con un plugin Maven di tipo 10KB, ma credo che sarebbe confuso ... –

risposta

2

sbt esclude alcuni tipi di pacchetti dai percorsi di classe che genera, poiché non tutti i tipi di imballaggio hanno senso dipendere da. Sfortunatamente, sembra fare questa esclusione in silenzio - e il valore predefinito di classpathTypes non è sempre quello che vuoi.

Il tipo di imballaggio della dipendenza può essere trovato nella dipendenza pom.xml o ivy.xml (come applicabile). Ci sono due casi principali:

  1. Se il tipo di confezione è in realtà pom, questo probabilmente significa che è un pom genitore e si sta tentando di dipendere la cosa sbagliata - cercare lo specifico modulo di Maven si vuole realmente!
  2. Se d'altra parte, è maven-plugin - come in questo caso particolare - è necessario aggiungere il tipo di imballaggio per classpathTypes, utilizzando: classpathTypes += "maven-plugin"

Altri casi sono probabilmente andando a essere simile a uno dei precedenti due casi.