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

时间:2011-10-20 00:12:05

标签: scala sbt

我有一个依赖于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

我很确定必须有简单的方法来做到这一点,但到目前为止它已经让我望而却步。

编辑:根据Pablo使用托管类路径而不是非托管类的消息,我可以将问题重新解释为:如何将本地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文件夹中抓取jar。

2 个答案:

答案 0 :(得分:16)

有些信息在Classpaths页面上提供,但不是很清楚或详细。该信息也可以使用inspect页面上描述的// 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 命令获得。

基本上,对于配置X,用简写符号表示:

unmanagedJars

因此,通常,当您想要添加非托管库时,可以将它们添加到unmanagedJars in Compile。例如,如果您将库添加到unmanagedClasspath,那么sbt将正确地在Compile RuntimeTestunmanagedClasspath上包含库。

但是,你想在这里进行显式控制。仅将库添加到您希望开启的unmanagedClasspath in Compile 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" ) } 。{{1}}。例如,在sbt 0.11.0 +:

{{1}}

假设war插件使用Runtime类路径,那些jar只会出现在编译类路径上而不会出现在战争中。

答案 1 :(得分:3)

sbt支持ivy-like configurations,并实现maven基本范围。

如果您想在编译类路径中使用某些jar但不想发送它们,我想provided范围适合您:

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