2015-03-19 3 views
3

Я пытаюсь использовать плагин sbt-web без рамки для воспроизведения и вместо этого создаю webapp с помощью xsbt-web-плагина.Как использовать sbt-web-выход с помощью xsbt-web-plugin через зависимость проекта SBT?

Я получил плагин sbt-web, правильно работающий с обработкой конвейера активов и создающий его действительный выход webjar (через packageBin), а также стандартный вывод «web/public/main» (через активы).

Отдельно, я использую xsbt-web-plugin для разработки webapp и обслуживания этого webapp изнутри SBT (через контейнер: начало). Проект webapp может потреблять зависимости webjar от mavenCentral и ссылаться на эти ресурсы без проблем.

Что я не смог выяснить, как я могу заставить xsbt-web-плагин включать активы, выходящие из конвейера sbt-web в веб-приложении. Кажется, что я могу сделать, чтобы получить их в CLASSPATH. (Из того, что я понимаю, это все, что нужно для игры, потому что у них есть «Контроллер активов», который обслуживает эти активы из CLASSPATH, и поэтому им не нужно, чтобы они были доступны как статические активы для веб-приложения).

Я сделал публичный репозиторий GitHub (https://github.com/MartinSnyder/serving-sbt-web-output), который демонстрирует то, что я пытаюсь сделать.

Мой plugins.sbt является:

resolvers += Resolver.typesafeRepo("releases") 

addSbtPlugin("com.typesafe.sbt" % "sbt-web" % "1.1.1") 

addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6") 

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "1.0.0") 

Мой build.sbt является:

name := "Example project serving sbt-web output from within SBT" 

organization in ThisBuild := "com.martinsnyder" 

version in ThisBuild := "0.0.1" 

scalaVersion in ThisBuild := "2.11.6" 

lazy val example_webjar = 
    project 
    .in(file("example_webjar")) 
    .settings(libraryDependencies ++= Seq("org.webjars" % "requirejs" % "2.1.16")) 
    .enablePlugins(SbtWeb) 

lazy val example_webapp = 
    project 
    .in(file("example_webapp")) 
    .dependsOn(example_webjar) 
    .settings(libraryDependencies ++= Seq(
     "javax.servlet" % "servlet-api" % "2.5" % "provided", 
     "org.eclipse.jetty" % "jetty-webapp" % "9.3.0.M2" % "container", 
     "org.eclipse.jetty" % "jetty-plus" % "9.3.0.M2" % "container", 
     "commons-logging" % "commons-logging" % "1.2" % "container" 
    )) 
    .enablePlugins(SbtWeb) 
    .settings(jetty(): _*) 

файл HTML в веб-приложение является:

<html> 
    <head> 
     <title>Example</title> 
     <link rel="stylesheet" type="text/css" href="css/main.css"> 
     <link rel="stylesheet" type="text/css" href="lib/example_webjar/css/main.css"> 
     <link rel="stylesheet" type="text/css" href="webjar/example_webjar/0.0.1/css/main.css"> 
     <script src="webjars/requirejs/2.1.16/require.js"></script> 
    </head> 
    <body> 
     <div class="red">Red</div> 
     <div class="green">Green</div> 
    </body> 
</html> 

На данном этапе, requirejs успешно обслуживается, поскольку он исходит из веб-сайта предварительной сборки. Три тега отличаются друг от друга и неудачные попытки ссылаться на вывод активов из sbt-web.

Лучший сценарий, я пытаюсь добиться, чтобы получить SBT-веб плагин вывода (цель/веб/общественности/основной/) включены в выходной xsbt-веб-плагин WebAPP (цель/веб-приложение/). Я бы согласился, что xsbt-web-плагин сможет получить доступ к зависимости проекта как webjar.

ответ

2

Если вы используете файл sbt-web в качестве каталога ресурсов веб-приложений, он должен получить большую часть вашего пути.

Просто добавьте webappSrc in webapp <<= WebKeys.assets in Assets в качестве параметра для вашего example_webapp проекта:

lazy val example_webapp = 
    project 
    .in(file("example_webapp")) 
    .dependsOn(example_webjar) 
    .settings(libraryDependencies ++= Seq(
     "javax.servlet" % "servlet-api" % "2.5" % "provided", 
     "org.eclipse.jetty" % "jetty-webapp" % "9.3.0.M2" % "container", 
     "org.eclipse.jetty" % "jetty-plus" % "9.3.0.M2" % "container", 
     "commons-logging" % "commons-logging" % "1.2" % "container" 
    )) 
    .enablePlugins(SbtWeb) 
    .settings(jetty(): _*) 
    .settings(webappSrc in webapp <<= WebKeys.assets in Assets) 
+0

Примечание: я ничего не знаю о sbt-web, поэтому дайте мне знать, что еще не хватает, и я посмотрю, смогу ли я исправить свой ответ. – earldouglas

+1

Спасибо Джеймсу. Это и есть. Самая близкая попытка, которую я имел в этом направлении, отсутствовала в «WebKeys». Для других людей, читающих это, основное ограничение этого подхода состоит в том, что может быть только одна папка webappSrc, поэтому, если у вас есть сеть.xml вам нужно замять это в «активы», хотя на самом деле это не так. –

+0

Для справки, Мартин [открыл проблему] (https://github.com/earldouglas/xsbt-web-plugin/issues/228) для улучшения поддержки xsbt-web-плагинов для этого. – earldouglas

1

До этого issue была решена, следующая конфигурация может быть полезна:

// To sbt-web: Use 'src/main/webapp' for asset sources 
sourceDirectory in Assets := baseDirectory.value/"src"/"main"/"webapp" 

// To xsbt-web-plugin: Use sbt-web output instead of 'src/main/webapp' 
webappSrc in webapp <<= WebKeys.assets in Assets 

Это позволит использовать src/main/webapp как для ваших активов, так и для обычных файлов конфигурации (например, web.xml).

Смежные вопросы