Saltar al contenido principal
Version: Next (5.0)

Maven y Frontend

Una aplicación AWE es un proyecto Spring Boot: añada el starter de AWE, elija un cliente frontend (AngularJS o React) y compile los recursos del frontend con Webpack a través de Maven. Esta página cubre esa configuración y los comandos para ejecutar y empaquetar la aplicación. Para el ciclo rápido de edición y recarga durante el desarrollo, consulte Dev Tools.

Configuración de Maven​

Añada la dependencia del starter de AWE:

<dependency>
<groupId>com.almis.awe</groupId>
<artifactId>awe-spring-boot-starter</artifactId>
<version>${awe.version}</version>
</dependency>

Añada el plugin de dependencias que descomprime las pantallas genéricas incluidas con AWE:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<id>unpack awe-generic-screens</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>com.almis.awe</includeGroupIds>
<includeArtifactIds>awe-generic-screens</includeArtifactIds>
<includes>schemas/**</includes>
<outputDirectory>${project.build.directory}/classes/static/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

Donde PROJECT-ACRONYM es el acrónimo del proyecto en mayúsculas y project-acronym es el mismo acrónimo en minúsculas.

Compilación del frontend​

AWE compila todos los archivos JavaScript y LESS con Webpack, lanzado desde pom.xml mediante el frontend-maven-plugin. Las compilaciones usan por defecto el modo production; npm run build es el alias de producción.

Para generar un bundle de desarrollo local, sobrescriba la propiedad de Maven:

mvn compile -Dbuild.environment=development

Añada la propiedad del entorno de compilación y configure el plugin para ejecutar el script npm específico de cada modo:

<properties>
<build.environment>production</build.environment>
</properties>

<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v24.14.0</nodeVersion>
<npmVersion>11.11.1</npmVersion>
</configuration>
</execution>
<execution>
<id>npm ci</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>ci --include=dev</arguments>
</configuration>
</execution>
<execution>
<id>npm run build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build:${build.environment}</arguments>
<environmentVariables>
<NODE_ENV>${build.environment}</NODE_ENV>
</environmentVariables>
</configuration>
</execution>
</executions>
</plugin>

npm ci --include=dev instala explícitamente las herramientas de desarrollo (como Jest y webpack-cli) para CI, pruebas y compilaciones. NODE_ENV=${build.environment} se aplica solo a la ejecución de la compilación, por lo que las compilaciones de producción siguen siendo de producción.

Cada paquete frontend que use Webpack debe exponer estos scripts:

{
"scripts": {
"build": "npm run build:production",
"build:development": "webpack --config webpack.config.js --mode development",
"build:production": "webpack --config webpack.config.js --mode production",
"test": "jest --config jest.config.js",
"test:coverage": "jest --config jest.config.js --coverage"
}
}

Esto mantiene por defecto las versiones de Maven y a sus consumidores en bundles optimizados, sin cambiar las rutas de los recursos generados. Use npm test para las pruebas unitarias locales y npm run test:coverage para Maven, CI, Sonar o cualquier ruta que necesite los informes JUnit y LCOV de Jest en target/reports/jest/.

Nota: más información sobre el plugin de LESS aquí.

Elección de un cliente frontend​

AWE ofrece dos clientes frontend. Elija uno por proyecto; la parte del servidor es idéntica.

ClienteCómo añadirloNotas
AngularJSDependencia Maven awe-client-angularEl cliente histórico; un único webpack.config.js.
ReactDependencia npm awe-react-clientEl cliente más reciente; configuración de Webpack dividida (dev/prod).

Cliente AngularJS​

Añada la dependencia:

<dependency>
<groupId>com.almis.awe</groupId>
<artifactId>awe-client-angular</artifactId>
<version>${awe.version}</version>
</dependency>

En el maven-dependency-plugin anterior, añada esta ejecución después de unpack awe-generic-screens:

<execution>
<phase>prepare-package</phase>
<id>unpack awe-client-angular</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>com.almis.awe</includeGroupIds>
<includeArtifactIds>awe-client-angular</includeArtifactIds>
<includes>images/**,fonts/**,js/**,css/**,less/**</includes>
<outputDirectory>${project.build.directory}/classes/static/</outputDirectory>
</configuration>
</execution>

El archivo webpack.config.js resuelve el modo a partir de los argumentos de la CLI o de NODE_ENV, desactiva los sourcemaps para el empaquetado de producción y conserva el directorio de salida y el publicPath:

const path = require("path");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const LessPluginAutoPrefix = require('less-plugin-autoprefix');
const dir = path.join(__dirname, "src", "main", "resources", "webpack");
const styleDir = path.resolve(__dirname, "src", "main", "resources", "less");
const autoprefixerBrowsers = ['last 2 versions', '> 1%', 'opera 12.1', 'bb 10', 'android 4', 'IE 10'];
const validModes = new Set(["development", "production"]);

const resolveMode = (env = {}, argv = {}) => {
const cliMode = argv.mode;
const envMode = env.NODE_ENV || env.mode || process.env.NODE_ENV;

if (validModes.has(cliMode)) {
return cliMode;
}

if (validModes.has(envMode)) {
return envMode;
}

return "production";
};

module.exports = (env = {}, argv = {}) => {
const mode = resolveMode(env, argv);
const isProduction = mode === "production";

return {
mode,
devtool : isProduction ? false : "source-map",
entry : {
"specific" : path.join(dir, "app.config.js")
},
output : {
filename : "js/[name].js",
path: path.join(__dirname, 'target', 'classes', 'static'),
publicPath : "../"
},
module : {
rules : [
{ test: /\.jsx?$/, exclude: /node_modules/, use: [{loader: 'babel-loader'}]},
{ test : /\.css$/, include : [ styleDir ], use : [MiniCssExtractPlugin.loader, "css-loader"]},
{ test : /\.less$/, include : [ styleDir ], use : [MiniCssExtractPlugin.loader, "css-loader", {
loader: "less-loader", options: { lessOptions: { plugins: [ new LessPluginAutoPrefix({browsers: autoprefixerBrowsers}) ] }, sourceMap: false } }]},
{ test : /\.(jpg|gif|png)$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 100000 } }, generator: { filename: './images/[hash][ext][query]' }},
{ test : /\.woff[2]*?(\?v=\d+\.\d+\.\d+)?$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 100000 } }, generator: { filename: './fonts/[hash][ext][query]', dataUrl: content => `data:application/font-woff;base64,${content.toString('base64')}` }},
{ test : /\.(ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', generator: { filename: './fonts/[hash][ext][query]' }},
]
},
resolve : {
extensions : [ ".js", ".css", ".less", "*" ]
},
plugins : [ new MiniCssExtractPlugin({
filename: "css/specific.css"
})]
};
};

Para Babel, mantenga la instrumentación de Istanbul solo en los flujos que no son de release (desarrollo o pruebas) y elimínela de las compilaciones de producción para que los artefactos distribuidos no estén instrumentados.

Cliente React​

Añada el cliente a package.json:

"dependencies": {
"awe-react-client": "AWE-REACT-VERSION"
}

donde AWE-REACT-VERSION es la versión de awe-react-client correspondiente a su versión del framework AWE: desde AWE 5 la versión del paquete es la versión del framework (AWE 5.0.0 usa awe-react-client@5.0.0). Las aplicaciones que aún usen awe-react-client 2.x pueden seguir la guía de actualización del cliente React.

El cliente React mantiene el mismo contrato de producción por defecto, con una configuración de Webpack dividida por entorno: webpack.config.js contiene la configuración común, webpack.dev.js el bundle de desarrollo y webpack.prod.js el bundle de producción. Las compilaciones de producción deben desactivar los sourcemaps (devtool: false) y evitar efectos secundarios opcionales de generación de documentación durante el empaquetado.

{
"scripts": {
"build": "npm run build:production",
"build:development": "webpack --config webpack.dev.js",
"build:production": "webpack --config webpack.prod.js"
}
}

Ejecución y compilación de la aplicación​

ObjetivoComando
Ejecutar la aplicaciónnpm start (ejecuta mvn spring-boot:run)
Ejecutar con recarga en caliente (desarrollo)npm run start:hot-reload — consulte Dev Tools
Compilar un bundle de desarrollomvn compile -Dbuild.environment=development
Compilar / empaquetar para producciónnpm run build o mvn package

Producción es el modo por defecto de mvn package y npm run build, por lo que las versiones y sus consumidores se mantienen en bundles optimizados y con hash, salvo que se solicite explícitamente una compilación de desarrollo.

Para el ciclo rápido de desarrollo — recompilaciones incrementales de JS/LESS y recarga de XML en vivo sin reiniciar la JVM — continúe en Dev Tools.