【问题标题】:Getting a Play/SBT app to depend on a Maven POM让 Play/SBT 应用程序依赖于 Maven POM
【发布时间】:2013-04-17 06:38:50
【问题描述】:

我的 Play 2 应用程序是一个更大的 Maven 应用程序的子项目。 Play 2 应用程序在其父应用程序中具有依赖关系 - 它从它获取数据访问权限。因此,我希望应用程序的构建依赖于外部 Maven 项目。

基本上,我想这样写:

val main = play.Project(appName, appVersion, appDependencies).settings(
   // settings
).dependsOn(externalPom(baseDirectory(_ / "../pom.xml")))

但这当然不是有效的语法。

我试过这样定义我的play.Project

val main = play.Project(appName, appVersion, appDependencies).settings(
   externalPom(baseDirectory(_ / "../pom.xml"))
)

失败是因为(我认为)覆盖导致 Play 无法加载自己的异常

我尝试像这样定义一个新的Project

lazy val data = Project("data", file(baseDirectory(_ / "..).settings(
   externalPom(baseDirectory(_ /         "../pom.xml"))
)

并且取决于那个,因为没有检测到主类,所以它不起作用。

关于如何做到这一点的任何建议?我是 SBT 的新手。

【问题讨论】:

  • 听起来有点奇怪 - 有没有机会让 play 2 应用独立?
  • 我们完全从 Maven 切换到 SBT。我们从未解决过这个问题中的问题。
  • 完全合理!

标签: maven playframework-2.0 sbt


【解决方案1】:

我成功使用 play2-maven-plugin

http://nanoko-project.github.io/maven-play2-plugin/maven/release/

使用此插件,您还可以为 play2 应用程序创建 maven 模块,并在 maven pom.xml 中定义依赖项(您的数据访问层)。该插件将确保 play 获取依赖项(它将 pom 依赖项复制到 lib 目录中的非托管依赖项中)。

使用此插件还可以避免许多繁琐的重新构建,因为您在一个项目中拥有所有内容,因此您的 IDE 无需重新构建即可看到所有模块的更改。

此外,当您使用该插件时,从本地 maven 存储库更新快照 maven 依赖项没有问题(此 sbt 错误 https://github.com/sbt/sbt/issues/321)。

【讨论】:

    【解决方案2】:

    我刚刚用play2-maven-pluginsbt-pom-reader 做了这个。

    这是您需要配置 play2-maven 项目的方式:

    <my-maven-project>/
      pom.xml                  <- Your maven build
      build.sbt                <- the sbt Play 2 configuration
      project/
         build.properties      <- the sbt version specification
         build.scala           <- the sbt build definition
         plugins.sbt           <- the sbt plugin configuration
    
      ..                       <- Whatever files are normally in your maven project.
    

    每个文件都应具有以下内容。

    pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.foo</groupId>
        <artifactId>bar</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>play2</packaging>
        <name>My mavenified Play 2 application</name>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <play2.version>2.2.1</play2.version>
            <play2-scala.version>2.10</play2-scala.version>
            <play2.plugin.version>1.0.0-alpha5</play2.plugin.version>
            <scala.version>2.10.2</scala.version>
        </properties>
        <repositories>
            <repository>
                <id>typesafe</id>
                <name>Typesafe - releases</name>
                <url>http://repo.typesafe.com/typesafe/releases/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
        <dependencies>
            <dependency>
                <groupId>org.scala-lang</groupId>
                <artifactId>scala-library</artifactId>
                <version>${scala.version}</version>
            </dependency>
            <dependency>
                <groupId>com.typesafe.play</groupId>
                <artifactId>play_${play2-scala.version}</artifactId>
                <version>${play2.version}</version>
            </dependency>
            <!-- only if using Java -->
            <dependency>
                <groupId>com.typesafe.play</groupId>
                <artifactId>play-java_${play2-scala.version}</artifactId>
                <version>${play2.version}</version>
            </dependency>
        </dependencies>
        <build>
            <sourceDirectory>${basedir}/app</sourceDirectory>
            <resources>
                <resource>
                    <directory>${basedir}/conf</directory>
                </resource>
                <resource>
                    <directory>${basedir}</directory>
                    <includes>
                        <include>public/**</include>
                    </includes>
                </resource>
            </resources>
            <!--<outputDirectory>target/scala-${play2-scala.version}/classes</outputDirectory>-->
            <plugins>
                <plugin>
                    <groupId>com.google.code.play2-maven-plugin</groupId>
                    <artifactId>play2-maven-plugin</artifactId>
                    <version>${play2.plugin.version}</version>
                    <extensions>true</extensions>
                    <dependencies>
                        <dependency>
                            <groupId>com.google.code.play2-maven-plugin</groupId>
                            <artifactId>play2-provider-play22</artifactId>
                            <version>${play2.plugin.version}</version>
                        </dependency>
                    </dependencies>
                    <!-- only if using Java -->
                    <configuration>
                        <mainLang>java</mainLang>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    build.sbt:

    play.Project.playJavaSettings //or play.Project.playScalaSettings
    

    项目/build.properties:

    sbt.version=0.13.0
    

    项目/build.scala:

    object BuildFromMavenPomSettings extends com.typesafe.sbt.pom.PomBuild
    

    项目/plugins.sbt:

    addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
    
    addSbtPlugin("com.typesafe.sbt" % "sbt-pom-reader" % "1.0.1")
    

    【讨论】:

    • 我没有实用的方法来验证这个答案是否正确,因为我不再将 Maven 与 SBT 一起使用。如果有人可以验证这个或其他答案,我很乐意标记一个正确的答案。
    猜你喜欢
    • 2011-04-12
    • 2011-08-30
    • 2014-05-18
    • 2011-07-14
    • 2013-06-12
    • 1970-01-01
    • 2022-12-06
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多