簡體   English   中英

SBT本地Maven存儲庫依賴性

[英]SBT local Maven repository dependency

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放入本地存儲庫中:

$ 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刪除常春藤緩存似乎沒有任何作用。

任何指針將不勝感激。 有一個GitHub項目,其源代碼在這里: https : //github.com/timfulmer/play-update-maven-snapshot

編輯1:

確保JAR實際上在本地倉庫中:

$ 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回購協議都正確。

謝謝,

-蒂姆

Dunno(如果這是早期版本的堆棧有問題),但是在具有完全相同設置的最新項目中,我沒有再遇到此問題。 那時,一旦設置不正確,就感覺路徑中的某些內容正在被緩存。

小心按照最新版本給出的順序執行上述步驟似乎會使一切變得愉快。

如果您確實遇到了這種情況,請參閱上面評論中的建議。 Aditya Pawade對隱藏討厭文件的位置有一些想法。

干杯,

-蒂姆

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM