Desde STS, estoy creando un proyecto 'Web' Spring Boot 1.5.2 estándar. Si ejecuta esta aplicación, se crean dos directorios: el directorio 'base' normal y un directorio 'tomcat-docbase'
. . . 4096 Mar 29 10:00 tomcat.2743776473678691880.8080 . . . 4096 Mar 29 10:00 tomcat-docbase.76291847886629412.8080Si cambio este proyecto a un proyecto WAR, solo obtengo el directorio 'base'
. . . 4096 Mar 29 10:06 tomcat.3131223012454570991.8080Es fácil anular el directorio base predeterminado usando
server.tomcat.basedir=.sin embargo, esto no tiene efecto en tomcat-docbase. Es posible anular tomcat-docbase mediante programación, pero parece un truco.
¿Alguien piensa que esto es un error?
Solución: cree un nombre de carpeta como público en su proyecto, en la misma carpeta con su JAR.
Motivo: del código springboot, no hay configuración para la carpeta docbase. pero puede crear una carpeta raíz común en el nombre de la carpeta de su proyecto como public , static o src/main/webapp , luego springboot nunca volverá a crear la carpeta temporal tomcat-docbase para usted.
private static final String[] COMMON_DOC_ROOTS = { "src/main/webapp", "public", "static" } ... public final File getValidDirectory() { File file = this.directory; file = (file != null ? file : getWarFileDocumentRoot()); file = (file != null ? file : getExplodedWarFileDocumentRoot()); file = (file != null ? file : getCommonDocumentRoot()); if (file == null && this.logger.isDebugEnabled()) { logNoDocumentRoots(); } else if (this.logger.isDebugEnabled()) { this.logger.debug("Document root: " + file); } return file; } ... private File getCommonDocumentRoot() { for (String commonDocRoot : COMMON_DOC_ROOTS) { File root = new File(commonDocRoot); if (root.exists() && root.isDirectory()) { return root.getAbsoluteFile(); } } return null; }Enlace: DocumentRoot.java
Para Spring Boot 2.x+
@Component public class EmbeddedServletContainerConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.setDocumentRoot(new File("/your/path/here")); } }Encontré una forma programática de configurar la carpeta docbase con spring y el servidor tomcat incorporado. Debe anular la implementación de TomcatEmbeddedServletContainerFactory de la siguiente manera:
public @Bean EmbeddedServletContainerFactory embeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory("/app", 8080) { @Override protected void configureContext(Context context, ServletContextInitializer[] initializers) { context.setDocBase("/path/to/your/docbase"); super.configureContext(context, initializers); } }; return factory; }