es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sbt construye el archivo .war con configuración/perfil personalizado.

Tengo un proyecto sbt con una configuración de entorno personalizada.

val Prod  = config("prod")  extend Compile describedAs "Alcance para construir paquetes de producción."
val Stage = config("stage") extend Compile describedAs "Alcance para construir paquetes de etapa."
val Local = config("local") extend Compile describedAs "Alcance para construir paquetes locales."

lazy val root = (project in file("."))
  .configs(Prod, Stage, Local)
  .enablePlugins(WarPlugin)
  .settings(
    name := "pet",
    dependencySettings
  ).
  settings(inConfig(Prod)(Classpaths.configSettings ++
Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
    unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
  )): _*).
  settings(inConfig(Stage)(Classpaths.configSettings ++
Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
    unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
  )): _*).
  settings(inConfig(Local)(Classpaths.configSettings ++
Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
    unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
  )): _*)

Entonces, cuando ejecuto el comando sbt Local/compile o sbt Local/run, veo en el directorio de destino mis clases compiladas con mi configuración Local.

Luego agrego el complemento xsbt-web-plugin para empaquetar el archivo .war.

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

Y en build.sbt

enablePlugins(WarPlugin)

Ahora intento ejecutar el comando sbt Local/package y solo obtengo un archivo .jar, pero no un archivo .war.

Si ejecuto el comando sbt package, obtengo archivos .jar y .war, pero sin mi configuración Local.

Ayúdame, por favor. ¿Cómo puedo hacer que sbt Local/package funcione correctamente?
O tal vez conoces alguna otra forma de construir un archivo .war con sbt.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que sbt Local/package funcione correctamente con el complemento xsbt-web-plugin, necesitas agregar WebPlugin.autoImport.webSettings a tu archivo build.sbt. Aquí tienes una versión actualizada de tu archivo build.sbt:

    val Prod  = config("prod")  extend Compile describedAs "Ámbito para construir paquetes de producción."
    val Stage = config("stage") extend Compile describedAs "Ámbito para construir paquetes de etapa."
    val Local = config("local") extend Compile describedAs "Ámbito para construir paquetes locales."
    
    lazy val root = (project in file("."))
      .configs(Prod, Stage, Local)
      .enablePlugins(WarPlugin)
      .settings(
        name := "pet",
        dependencySettings,
        // Agrega configuraciones web para habilitar el empaquetado de archivos WAR para cada configuración
        WebPlugin.autoImport.webSettings(Prod),
        WebPlugin.autoImport.webSettings(Stage),
        WebPlugin.autoImport.webSettings(Local)
      )
      .settings(inConfig(Prod)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
      .settings(inConfig(Stage)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
      .settings(inConfig(Local)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
    

    Al agregar WebPlugin.autoImport.webSettings a cada configuración, habilitarás el empaquetado de archivos .war para cada configuración. Ahora, cuando ejecutes sbt Local/package, deberías ver tu archivo .war en el directorio target/scala-2.12.

    Alternativamente, también puedes usar el complemento sbt-assembly para construir un archivo .war. Aquí tienes un ejemplo de configuración del archivo build.sbt para sbt-assembly:

    // Agrega el complemento sbt-assembly
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")
    
    // Define configuraciones personalizadas
    val Prod  = config("prod")  extend Compile describedAs "Ámbito para construir paquetes de producción."
    val Stage = config("stage") extend Compile describedAs "Ámbito para construir paquetes de etapa."
    val Local = config("local") extend Compile describedAs "Ámbito para construir paquetes locales."
    
    // Define proyecto raíz
    lazy val root = (project in file("."))
      .configs(Prod, Stage, Local)
      .settings(
        name := "pet",
        dependencySettings,
        // Agrega configuraciones assembly para habilitar el empaquetado de archivos WAR para cada configuración
        assemblySettings(Prod),
        assemblySettings(Stage),
        assemblySettings(Local)
      )
      .settings(inConfig(Prod)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
      .settings(inConfig(Stage)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
      .settings(inConfig(Local)(Classpaths.configSettings ++ 
      Defaults.configTasks ++ Defaults.resourceConfigPaths ++ Seq(
        unmanagedResourceDirectories += {baseDirectory.value / "src" / "main" / configuration.value.name / "resources"}
      )): _*)
      // Establece las configuraciones de assembly
      .settings(
        assemblyMergeStrategy in assembly := {
          case PathList("META-INF", xs @ _*) => MergeStrategy.discard
          case x => MergeStrategy.first
        },
        assemblyJarName in assembly := s"${name.value}-${version.value}.war",
        assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false),
        publishArtifact in (Compile, packageBin) := false,
        publishArtifact in (Compile, packageDoc) := false,
        publishArtifact in (Compile, packageSrc) := false
      )
    

    Al agregar el complemento sbt-assembly y las configuraciones assemblySettings a cada configuración, habilitarás el empaquetado de archivos .war para cada configuración. Ahora, cuando ejecutes sbt Local/assembly, deberías ver tu archivo .war en el directorio target/scala-2.12.

    Ten en cuenta que, por defecto, el complemento sbt-assembly no incluye las bibliotecas de Scala en el artefacto empaquetado. Para incluir las bibliotecas de Scala, puedes establecer includeScala := true en las configuraciones assemblyOptions. Sin embargo, esto puede aumentar significativamente el tamaño del artefacto empaquetado.

Comments are closed.