【问题标题】:Remove entry from classpath after compile编译后从类路径中删除条目
【发布时间】:2014-06-16 19:12:21
【问题描述】:

我有一个遗留的war项目,依赖于一个jar项目,jar项目需要在classpath中添加几个非托管的jar进行编译。但是这些罐子不应该在战争中打包。所以我的问题是如何从 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 添加到托管类路径。我的罐子被放置在一个(非常)非标准布局的本地文件夹中:

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

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    Classpaths页面上提供了一些信息,但不是很清楚或很详细。该信息也可使用inspect 命令获得,如Inspecting Settings 页面所述。

    基本上,对于配置 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 上包含 CompileRuntimeTest 上的库。

    但是,您需要在此处进行显式控制。仅将库添加到您想要 jars 的unmanagedClasspath,即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"
      )
    }
    

    假设 war 插件使用 Runtime 类路径,这些 jar 将只显示在编译类路径中,而不显示在 war 中。

    【讨论】:

      【解决方案2】:

      sbt 支持ivy-like configurations,并实现了maven基本作用域。

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

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

      【讨论】:

      • 我在考虑这个问题,问题是我们不能(公司政策,我不能改变)使用自动下载的库(包括它们的传递依赖)。因此,每个 Eclipse 项目都有一个放置 jar 的 lib 文件夹,我一直无法找到使用 libraryDependencies 的示例,将 jar 放置在本地(项目内部)的非 ivy/maven 布局(fx /lib/gwt/2.3/ gwt-user.jar /lib/gwt/2.3/gwt-dev.jar ...)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多