Удалить запись из classpath после компиляции - PullRequest
7 голосов
/ 20 октября 2011

У меня есть устаревший военный проект, который зависит от проекта jar, проект jar должен добавить несколько неуправляемых jar-файлов в classpath для компиляции.Но эти банки не должны быть упакованы в войну.Поэтому мой вопрос заключается в том, как удалить эти записи из fullClasspath .Следующее не будет работать:

val excludeFilter = "(servlet-api.jar)|(gwt-dev.jar)|(gwt-user.jar)"
val filteredCP = cp.flatMap({ entry =>
   val jar = entry.data.getName()
   if (jar.matches(excludeFilter)) {
     Nil
   } else {
     Seq(entry)
   }
})
fullClasspath in Runtime = filteredCP

Я почти уверен, что должен быть простой способ сделать это, но пока он ускользнул от меня.

Редактировать :Основываясь на предложении Пабло использовать управляемый путь к классу вместо неуправляемого, я могу перефразировать вопрос следующим образом: как добавить локальные файлы jar в managedClasspath .Мои банки помещены в локальную папку с (очень) нестандартной компоновкой:

lib/testng.jar
lib/gwt/2.3/gwt-user.jar
lib/jetty/servlet.jar

Поэтому в основном я ищу что-то вроде:

libraryDependencies += "testng" % "provided->test"
libraryDependencies += "gwt" % "2.3" % "gwt-user" % "provided->compile"
libraryDependencies += "jetty" % "servlet" % "provided->default"

, позволяющее мне брать банки с моегособственная локальная папка lib.

Ответы [ 2 ]

16 голосов
/ 23 октября 2011

Некоторая информация предоставлена ​​на странице Classpaths , но она не очень ясна или детальна.Информация также доступна с помощью команды inspect, описанной на странице Проверка настроек .

В основном, для конфигурации X, в краткой записи:

// complete, exported classpath, such as used by 
//   'run', 'test', 'console', and the war task
fullClasspath in X =
  dependencyClasspath in X ++ exportedProducts in X

// classpath only containing dependencies, 
//   used by 'compile' or 'console-quick', for example
dependencyClasspath in X =
  externalDependencyClasspath in X ++ internalDependencyClasspath in X

// classpath containing only dependencies external to the build
//  (as opposed to the inter-project dependencies in internalDependencyClasspath)
externalDependencyClasspath in X =
  unmanagedClasspath in X ++ managedClasspath in X

// the manually provided classpath
unmanagedClasspath in X =
  unmanagedJars for X and all configurations X extends, transitively

Итак, обычно, когда вы хотите добавить неуправляемые библиотеки, вы добавляете их в unmanagedJars.Например, если вы добавите библиотеки в unmanagedJars in Compile, то sbt будет правильно включать библиотеки в unmanagedClasspath для Compile, Runtime и Test.

Однако вы хотите явно контролироватьВот.Добавляйте библиотеки только в unmanagedClasspath, в котором вы хотите установить файлы jar, а это unmanagedClasspath in Compile.Например, в sbt 0.11.0 +:

unmanagedClasspath in Compile <++= baseDirectory map { base =>
  val lib = base / "lib"
  Seq(
    lib / "testng.jar",
    lib / "gwt/2.3/gwt-user.jar",
    lib / "jetty/servlet.jar"
  )
}

Предполагая, что плагин войны использует путь к классу Runtime, эти файлы будут отображаться только на пути к классам компиляции, а не на войне.

3 голосов
/ 20 октября 2011

sbt поддерживает ivy-like конфигурации и реализует базовые области maven.

Если вы хотите использовать несколько jar-файлов в вашем пути к классам компиляции, но не хотите их отправлять, я полагаюprovided сфера для вас:

libraryDependencies += "org.example" % "example" % "1.0" % "provided->compile"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...