【发布时间】: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