jamesfredley opened a new issue, #15377:
URL: https://github.com/apache/grails-core/issues/15377
   `org.grails.cli.boot.SpringApplicationWebApplicationInitializer` class 
(causing the NPE during Tomcat WAR deployment) is being transitively included 
via the Grails Database Migration functionality. Specifically:
   
   - This originates from `org.apache.grails:grails-data-hibernate5-dbmigration`
   - In Grails 7+, the Database Migration plugin depends on 
`org.apache.grails:grails-shell` for certain scripts and commands (e.g., 
Liquibase-related operations like `dbm-*` scripts).
   - `grails-shell` pulls in Spring Boot CLI components, including the 
problematic initializer that's only intended for standalone executable JARs—not 
traditional WAR deployments in an external container like Tomcat.
   
   The presence of this transitive dependency explains why the class is on the 
classpath and gets invoked by Tomcat during context startup, leading to the 
null "sources" in `MANIFEST.MF`.
   
   Workaround for Grails 7, build.gradle:
   
   ```
   bootWar {
       classpath = classpath.filter { 
           !it.name.contains('spring-boot-cli') && 
           !it.name.contains('grails-shell')
       }
   }
   ```
   
   Potential updates for Grails 8:
   
   Option 1: Gradle Feature Variant 
   In the plugin's build.gradle:
   
   ```
   java {
       registerFeature('cli') {
           usingSourceSet(sourceSets.main)
       }
   }
   dependencies {
       // Core - always included
       implementation("org.liquibase:liquibase-core:${liquibaseVersion}")
       
implementation("org.liquibase.ext:liquibase-hibernate5:${liquibaseVersion}")
       
       // CLI feature - opt-in
       cliApi("org.apache.grails:grails-shell-cli:${grailsVersion}") {
           exclude group: 'org.slf4j', module: 'slf4j-simple'
           exclude group: 'org.codehaus.groovy'
       }
   }
   ```
   
   Consuming apps would then:
   
   ```
   // Core functionality (in WAR)
   implementation("org.apache.grails:grails-data-hibernate5-dbmigration:7.0.7")
   // CLI commands (dev only)
   
developmentOnly("org.apache.grails:grails-data-hibernate5-dbmigration:7.0.7") {
       capabilities {
           
requireCapability("org.apache.grails:grails-data-hibernate5-dbmigration-cli")
       }
   }
   
   ```
   ---
   
   Option 2: Use compileOnlyApi + Document for Apps (Simpler)
   In the plugin's build.gradle:
   
   ```
   // Available at compile time for the plugin, but consumers must explicitly 
add it
   compileOnlyApi("org.apache.grails:grails-shell-cli:${grailsVersion}") {
       exclude group: 'org.slf4j', module: 'slf4j-simple'
       exclude group: 'org.codehaus.groovy'
   }
   
   ```
   Consuming apps add:
   
   `developmentOnly("org.apache.grails:grails-shell-cli:7.0.7")`
   
   ---
   Option 3: Separate Artifact
   Split into two published artifacts:
   - grails-data-hibernate5-dbmigration - core runtime (no CLI)
   - grails-data-hibernate5-dbmigration-cli - CLI commands (depends on core + 
grails-shell-cli)
   Apps use:
   
   ```
   implementation("org.apache.grails:grails-data-hibernate5-dbmigration:7.0.7")
   
developmentOnly("org.apache.grails:grails-data-hibernate5-dbmigration-cli:7.0.7")
   ```
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to