Scala 编译后从类路径中删除条目

Scala 编译后从类路径中删除条目,scala,sbt,Scala,Sbt,我有一个依赖于jar项目的遗留war项目,jar项目需要向类路径添加一些非托管jar进行编译。但是这些罐子不应该在战争中包装。因此,我的问题是如何从完整类路径中删除这些条目。以下操作不起作用: val excludeFilter = "(servlet-api.jar)|(gwt-dev.jar)|(gwt-user.jar)" val filteredCP = cp.flatMap({ entry => val jar = entry.data.getName() if (j

我有一个依赖于jar项目的遗留war项目,jar项目需要向类路径添加一些非托管jar进行编译。但是这些罐子不应该在战争中包装。因此,我的问题是如何从完整类路径中删除这些条目。以下操作不起作用:

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
我很确定一定有一个简单的方法可以做到这一点,但到目前为止,我还没有找到

编辑:根据Pablo关于使用托管类路径而不是非托管类路径的建议,我可以将问题重新表述为:如何将本地JAR添加到托管类路径。我的JAR放在本地文件夹中,布局(非常)不标准:

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文件夹中获取jar。

sbt支持并实现maven基本作用域

如果您想在编译类路径中使用一些JAR,但不想发布它们,我想提供的
范围适合您:

libraryDependencies += "org.example" % "example" % "1.0" % "provided->compile"

页面上提供了一些信息,但不是很清楚或详细。还可以使用页面上描述的
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
,则sbt将正确地包括
编译
运行时
测试
非托管类路径
上的库

但是,这里需要显式控制。仅将库添加到要打开JAR的
unmanagedClasspath
中,即编译中的
unmanagedClasspath
。例如,在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"
  )
}
编译中的非托管类路径 val lib=base/“lib” 序号( lib/“testng.jar”, lib/“gwt/2.3/gwt user.jar”, lib/“jetty/servlet.jar” ) }

假设war插件使用运行时类路径,那么这些JAR只会出现在编译类路径上,而不会出现在war中。

我在想这个问题,问题是我们不能(公司政策,我不能更改)使用自动下载的LIB(包括它们的可传递依赖项)。因此,每个eclipse项目都有一个放置jar的lib文件夹,我一直找不到一个使用libraryDependencies的示例,该示例将jar放在非ivy/maven布局(fx/lib/gwt/2.3/gwt-user.jar/lib/gwt/2.3/gwt-dev.jar…)的本地(项目内部)。