【问题标题】:SBT local Maven repository dependencySBT 本地 Maven 存储库依赖
【发布时间】:2014-03-01 06:17:45
【问题描述】:

Scala Play 应用依赖于使用 Gradle 部署到本地 Maven 存储库的 Java 库时遇到了一些问题。我已经设置了一个测试项目,其中包含一个包含一个类的简单 Gradle Java 模块,以及一个使用该类的简单 Scala Play 项目。 Java 类如下所示:

public class TestClass {

    public String testMethod(){

        return "Some content we will change later.";
    }
}

使用 build.gradle 设置将 JAR 部署到本地 Maven 存储库:

apply plugin: 'java'
apply plugin: 'maven'

sourceCompatibility = 1.7

project.group = 'play-update-maven-snapshot'
version = '1.0-SNAPSHOT'

运行 gradle install 将 JAR 放到本地 repo 中:

$ ls ~/.m2/repository/play-update-maven-snapshot/gradle-java/1.0-SNAPSHOT/
gradle-java-1.0-SNAPSHOT.jar    maven-metadata-local.xml
gradle-java-1.0-SNAPSHOT.pom

在 Scala/Play/SBT 方面,build.properties 更新为:

sbt.version=0.13.1

获取https://github.com/sbt/sbt/issues/321 中记录的更改。

根据当前的 SBT 文档配置了 build.sbt,用于从本地 Maven 存储库中获取工件:

name := "play-scala"

version := "1.0-SNAPSHOT"

resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

libraryDependencies ++= Seq(
    jdbc,
    anorm,
    cache
)

libraryDependencies+= "play-update-maven-snapshot" % "gradle-java" % "1.0-SNAPSHOT"

play.Project.playScalaSettings

Application.scala 更新为如下所示:

package controllers

import play.api.mvc._

object Application extends Controller {
    def index = Action {
        Ok(views.html.index(new TestClass().testMethod()))
    }
}

还有一个被黑的 index.scala.html 来简单地显示传递给它的内容:

@(message: String)

@main("Welcome to Play") {

    message

}

我们有简单的测试环境。开始播放不显示任何依赖错误:

$ play run
[info] Loading project definition from /<redacted>/play-update-maven-snapshot/play-scala/project
[info] Set current project to play-scala (in build file:/<redacted>/play-update-maven-snapshot/play-scala/)
[info] Updating {file:/<redacted>/play-update-maven-snapshot/play-scala/}play-scala...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

不幸的是,访问 localhost:9000 给出了这个:

[info] Compiling 5 Scala sources and 1 Java source to /<redacted>/play-update-maven-snapshot/play-scala/target/scala-2.10/classes...
[error] /<redacted>/play-update-maven-snapshot/play-scala/app/controllers/Application.scala:8: not found: type TestClass
[error]     Ok(views.html.index(new TestClass().testMethod()))

感觉这可能与上面提到的 SBT/Ivy 缓存本地 SNAPSHOT 的旧问题有关。但是,使用rm -Rf ~/.ivy2/cache/play-update-maven-snapshot 删除 Ivy 缓存似乎没有任何作用。

任何指针将不胜感激。这里有一个 GitHub 项目的源代码:https://github.com/timfulmer/play-update-maven-snapshot

编辑 1:

确保 JAR 实际上在本地 repo 中:

$ ls -n ~/.m2/repository/play-update-maven-snapshot/gradle-java/1.0-SNAPSHOT/gradle-java-1.0-SNAPSHOT.jar
-rw-r--r--  1 501  20  634 Feb  4 11:53 /Users/<redacted>/.m2/repository/play-update-maven-snapshot/gradle-java/1.0-SNAPSHOT/gradle-java-1.0-SNAPSHOT.jar

更新 build.sbt 来自

resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

resolvers += Resolver.mavenLocal

还是不开心。

编辑 2:

真的很绝望:)

$ jar xvf ~/.m2/repository/play-update-maven-snapshot/gradle-java/1.0-SNAPSHOT/gradle-java-1.0-SNAPSHOT.jar 
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
 inflated: TestClass.class
$ cat ./TestClass.class 
????3
<init>()VCodeLineNumberTableLocalVariableTablethis
                                              LTestClass;
testMethod()Ljava/lang/String;
SourceFileTestClass.java
                    "Some content we will change later.
TestClassjava/lang/Object!/*??

看起来本地 Maven 存储库的所有内容都是正确的。

谢谢,

-- 提姆

【问题讨论】:

  • ~/.m2/repository 是 Gradle 对本地 Maven 存储库位置的默认设置。如果这不是你得到的,也许它找到另一个settings.xml 告诉它。
  • 不确定file:// 是否必要。还有预定义的本地 maven 存储库:Resolver.mavenLocal
  • @4e6 感谢您的指点。我用你的建议更新了问题和 GitHub 项目。不幸的是,它似乎没有解决这个问题。
  • play 在 ${PLAY_HOME}/repository/ 中有自己的缓存。您需要从 ${PLAY_HOME}/repository/ 中删除所有内容并仅保留本地内容。或者您可以运行项目 sbt run 而不是 play run
  • 我发现问题是我的 play compile 从 play 目录中的 repo 中提取了 jars。 Intellij 从本地 ivy2 存储库中获取它。因此,每当我想更新外部模块时,首先我从两个存储库中删除了 jar,然后在外部模块(maven)上运行全新安装,确保通过提取在两个存储库(播放目录和 ivy2)中都更新了类罐子。然后我在我的游戏项目中运行了 play clean update compile 。 build.sbt 的配置与您第一次编辑时的配置相同。(添加了本地 maven repo 的解析器并添加了模块的 libraryDependencies)

标签: scala maven playframework-2.0 gradle sbt


【解决方案1】:

不知道这是不是早期版本的堆栈的问题,但在最近的一个具有完全相同设置的项目中,我没有再次遇到这个问题。当时感觉路径中的某些内容一旦设置不正确就会被缓存。

按照最新版本给出的顺序小心执行上述步骤似乎会让一切都变得愉快。

如果您确实遇到这种情况,请参阅上面 cmets 中的建议。 Aditya Pawade 对这些讨厌的文件可能隐藏在哪里有一些想法。

干杯,

-- 提姆

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2015-02-23
    • 2012-02-03
    • 2020-07-13
    • 2017-06-12
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多