2016-03-02 3 views
2

я борюсь решения некоторых столкновений библиотеки зависимостей Javascript в следующем build.sbt файле:Как решить «Неоднозначная ссылка на библиотеку JS»?

lazy val root = project.in(file(".")).enablePlugins(ScalaJSPlugin) 

scalaVersion := "2.11.7" 

libraryDependencies ++= Seq(
    "org.scala-js" %%% "scalajs-java-time" % "0.1.0", 
    "org.querki" %%% "jquery-facade" % "0.10" 
) 

jsDependencies ++= Seq(
    "org.webjars.bower" % "jquery" % "3.0.0-beta1"/"jquery.js" 
) 

При выполнении fastOptJS задачи я получаю следующее сообщение об ошибке:

[trace] Stack trace suppressed: run last compile:resolvedJSDependencies for the full output. 
[error] (compile:resolvedJSDependencies) org.scalajs.core.tools.jsdep.JSLibResolveException: Some references to JS libraries could not be resolved: 
[error] - Ambiguous reference to a JS library: jquery.min.js 
[error] Possible paths found on the classpath: 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.min.js 
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.min.js 
[error] originating from: root:compile 
[error] - Ambiguous reference to a JS library: jquery.js 
[error] Possible paths found on the classpath: 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/src/jquery.js 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.js 
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.js 
[error] originating from: root:compile, root:compile 
[error] Total time: 1 s, completed Mar 2, 2016 12:36:43 PM */ 

Как я могу решить неоднозначные ссылки на библиотеки Javascript в этом случае?

ответ

2

Основываясь на this Github issue, я узнал, что можно указать путь для устранения неоднозначности ссылок на библиотеки Javascript. Давайте попробуем устранить ошибку jquery.js, добавив путь dist.

jsDependencies ++= Seq(
    "org.webjars.bower" % "jquery" % "3.0.0-beta1"/"dist/jquery.js" 
) 

Но работает fastOptJS снова возвращается в ту же ошибку

[error] - Ambiguous reference to a JS library: jquery.min.js 
[error] Possible paths found on the classpath: 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.min.js 
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.min.js 
[error] originating from: root:compile 
[error] - Ambiguous reference to a JS library: jquery.js 
[error] Possible paths found on the classpath: 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/src/jquery.js 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.js 
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.js 
[error] originating from: root:compile 
[error] Total time: 2 s, completed Mar 2, 2016 7:29:08 PM 

Эта проблема на самом деле создается с помощью libraryDependencies записи "org.querki" %%% "jquery-facade" % "0.10". Использование в dependency graph SBT plugin мы видим полный граф зависимостей:

[info] root:root_sjs0.6_2.11:0.1-SNAPSHOT [S] 
[info] +-org.querki:jquery-facade_sjs0.6_2.11:0.10 [S] 
[info] | +-org.querki:querki-jsext_sjs0.6_2.11:0.6 [S] 
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7) 
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.7 [S] 
[info] | | 
[info] | +-org.scala-js:scalajs-dom_sjs0.6_2.11:0.8.0 [S] 
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.0 (evicted by: 0.6.7) 
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7) 
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.7 [S] 
[info] | | 
[info] | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7) 
[info] | +-org.scala-js:scalajs-library_2.11:0.6.7 [S] 
[info] | +-org.webjars:jquery:2.1.4 
[info] | 
[info] +-org.scala-js:scalajs-java-time_sjs0.6_2.11:0.1.0 [S] 
[info] | +-org.scala-js:scalajs-library_2.11:0.6.6 (evicted by: 0.6.7) 
[info] | +-org.scala-js:scalajs-library_2.11:0.6.7 [S] 
[info] | 
[info] +-org.scala-js:scalajs-library_2.11:0.6.6 (evicted by: 0.6.7) 
[info] +-org.scala-js:scalajs-library_2.11:0.6.7 [S] 
[info] +-org.webjars.bower:jquery:3.0.0-beta1 

Выход показывает org.querki:jquery-facade_sjs0.6_2.11:0.10 зависеть от org.webjars:jquery:2.1.4. Это объясняет сообщение об ошибке Ambiguous reference to a JS library, потому что у нас все еще есть две версии библиотеки jquery, доступные в перечисленных зависимостях.

Что мы можем попробовать, это использовать exclude в зависимости от библиотеки.

libraryDependencies ++= Seq(
    "org.scala-js" %%% "scalajs-java-time" % "0.1.0", 
    "org.querki" %%% "jquery-facade" % "0.10" exclude("org.webjars","jquery") 
) 

Запуск fastOptJS задачу теперь возвращает

[error] (compile:resolvedJSDependencies) org.scalajs.core.tools.jsdep.JSLibResolveException: Some references to JS libraries could not be resolved: 
[error] - Ambiguous reference to a JS library: jquery.js 
[error] Possible paths found on the classpath: 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/src/jquery.js 
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.js 
[error] originating from: root:compile 
[error] Total time: 2 s, completed Mar 2, 2016 7:47:14 PM 

Таким образом, хотя мы избавились от некоторых ошибок, мы не совсем там еще. Я не 100% уверен, что здесь, но, кажется, эта ошибка является результатом в how the build.sbt of the jQuery Facade includes jQuery using jsDependencies itself:

jsDependencies += "org.webjars" % "jquery" % "2.1.4"/"jquery.js" minified "jquery.min.js" 

Так что, похоже, мы столкнулись с той же проблемой, мы имели в начале. Неквалифицированный jquery.js (т. Е. Без предшествующего пути) не может быть однозначно разрешен.

Для решения этой проблемы мы можем использовать настройку jsManifestFilter. Я нашел этот совет в Scala.js Gitter room.

jsManifestFilter := { 
    import org.scalajs.core.tools.jsdep.{JSDependencyManifest, JSDependency} 

    (seq: Traversable[JSDependencyManifest]) => { 
    seq map { manifest => 

     def isOkToInclude(jsDep: JSDependency): Boolean = { 
     println(s"jsDep=>$jsDep") 
     jsDep.resourceName != "jquery.js" 
     } 

     new JSDependencyManifest(
     origin = manifest.origin, 
     libDeps = manifest.libDeps filter isOkToInclude, 
     requiresDOM = manifest.requiresDOM, 
     compliantSemantics = manifest.compliantSemantics 
    ) 
    } 
    } 
} 

Здесь мы перезаписать настройки jsManitestFilter и явно отфильтровать голую jquery.js зависимость. fastOptJS задача теперь работает отлично:

[info] Resolving org.eclipse.jetty#jetty-continuation;8.1.16.v20140903 ... 
[info] Done updating. 
jsDep=>JSDependency(resourceName=dist/jquery.js) 
jsDep=>JSDependency(resourceName=jquery.js, minifiedResourceName=Some(jquery.min.js)) 
[info] Fast optimizing jsdeps/target/scala-2.11/root-fastopt.js 
[success] Total time: 3 s, completed Mar 2, 2016 8:27:40 PM 

Обратите внимание, что добавленный println заявление также выводит resourceName для включенных зависимостей.

+0

http://stackoverflow.com/questions/37239261/ambiguous-reference-to-a-js-library-jquery-js – ses

Смежные вопросы