Java Grails上的NoClassDefFoundError GANT脚本
我正在尝试在我的Grails插件之前构建一些GANT脚本。 基本上,我想用新类扩展DefaultGrailTemplateGenerator类,该类添加了新方法,通过Grails模板方案自动生成服务类 假设我用服务生成器命名我的类,它扩展了RailsTemplateGenerator和add generateService方法Java Grails上的NoClassDefFoundError GANT脚本,java,grails,groovy,classpath,gant,Java,Grails,Groovy,Classpath,Gant,我正在尝试在我的Grails插件之前构建一些GANT脚本。 基本上,我想用新类扩展DefaultGrailTemplateGenerator类,该类添加了新方法,通过Grails模板方案自动生成服务类 假设我用服务生成器命名我的类,它扩展了RailsTemplateGenerator和add generateService方法 import org.codehaus.groovy.grails.scaffolding.DefaultGrailsTemplateGenerator; class
import org.codehaus.groovy.grails.scaffolding.DefaultGrailsTemplateGenerator;
class ServiceGenerator extends DefaultGrailsTemplateGenerator {
void generateService(GrailsDomainClass domainClass, String destdir) {
}
}
所有事情都正常进行(例如调用了甘特脚本),除了我实例化ServiceGeneratorClass的一行代码外,它返回错误:
Error Error executing script GenerateService: com.cygnus.grails.util.scaffolding.ServiceGenerator
java.lang.NoClassDefFoundError: com.cygnus.grails.util.scaffolding.ServiceGenerator
at GenerateExt_groovy.class$(GenerateExt_groovy)
at GenerateExt_groovy.$get$$class$com$cygnus$grails$util$scaffolding$ServiceGenerator(GenerateExt_groovy)
at GenerateExt_groovy.generateForDomainClass(GenerateExt_groovy:81)
我尝试浏览此错误,并尝试通过更改以下语法来调用该类:
def templateGenerator = new ServiceGenerator(classLoader)
致:
我仍然发现java.lang.NoClassDefFoundError。
我还是不明白为什么会发生这种事。
有人能帮我吗
我附加调用服务生成器的甘特脚本
/**
* Gant Script for generating Service Class based on Artifact
* This Script was used for auto generate service class which is needed to handle basic transactional statements such as:
* - AuditTrail for tables
* - Logging before insert / update on tables
*/
includeTargets << grailsScript("_GrailsCreateArtifacts")
includeTargets << new File("${myPluginPluginDir}/scripts/GenerateExt.groovy")
target ('main': "Generates the CRUD service for a specified domain class") {
depends(checkVersion, parseArguments, packageApp,classpath,configureProxy,
loadApp, configureApp, compile)
promptForName(type: "Domain Class")
generateViews = false
generateForName = argsMap["params"][0]
generateForOne()
}
setDefaultTarget(main)
/**
*基于工件生成服务类的甘特脚本
*此脚本用于自动生成服务类,该类需要处理基本事务语句,例如:
*-表的审核跟踪
*-在表上插入/更新之前进行日志记录
*/
includeTargets我终于完成了
这是您想要做的一个示例:
这是我的实现:
*将$userInterfacePluginDir更改为您的插件名称
将此文件放入脚本中:
GenerateService.groovy
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsCreateArtifacts")
includeTargets << new File("$userInterfacePluginDir/scripts/_GrailsGenerateService.groovy")
target ('default': "Generates the service for a specified domain class") {
depends(checkVersion, parseArguments, packageApp)
promptForName(type: "Domain Class")
generateForName = argsMap["params"][0]
generateServiceForOne()
}
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.scaffolding.*
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.FileSystemResource;
import grails.util.GrailsNameUtils
/**
* Gant script that generates a service for a given domain class
*
* @author Martín Caballero
*
*/
includeTargets << grailsScript("_GrailsBootstrap")
generateForName = null
target(generateServiceForOne: "Generates service for only one domain class.") {
depends(loadApp)
def name = generateForName
name = name.indexOf('.') > 0 ? name : GrailsNameUtils.getClassNameRepresentation(name)
def domainClass = grailsApp.getDomainClass(name)
if (!domainClass) {
grailsConsole.updateStatus "Domain class not found in grails-app/domain, trying hibernate mapped classes..."
bootstrap()
domainClass = grailsApp.getDomainClass(name)
}
if (domainClass) {
generateServiceForDomainClass(domainClass)
event("StatusFinal", ["Finished generation for domain class ${domainClass.fullName}"])
}
else {
event("StatusFinal", ["No domain class found for name ${name}. Please try again and enter a valid domain class name"])
exit(1)
}
}
def generateServiceForDomainClass(domainClass) {
UserInterfaceTemplateGenerator = classLoader.loadClass('plugin.ui.scaffold.UserInterfaceTemplateGenerator')
def templateGenerator = UserInterfaceTemplateGenerator.newInstance(classLoader)
templateGenerator.grailsApplication = grailsApp
templateGenerator.pluginManager = pluginManager
event("StatusUpdate", ["Generating service for domain class ${domainClass.fullName}"])
templateGenerator.generateService(domainClass, basedir)
event("GenerateServiceEnd", [domainClass.fullName])
}
<%import org.codehaus.groovy.grails.commons.GrailsClassUtils;%>
<%=packageName ? "package ${packageName}\n\n" : ''%>
class ${className}Service {
def getTable() {
def query = {
<%
def searchFields = GrailsClassUtils.getStaticPropertyValue(domainClass.clazz, 'search' )
if(searchFields)
{
%>
if (params.q) {
or{
<%searchFields.each { field ->%>
ilike("${field}", '%' + params.q + '%')
<%}%>
}
}
<% } %>
if (params.sort){
order(params.sort,params.order)
}
}
def criteria = ${className}.createCriteria()
return criteria.list(query, max: params.max, offset: params.offset)
}
}
最后,这是我的模板:(将其放入src/templates/scaffolding/)
Service.groovy
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsCreateArtifacts")
includeTargets << new File("$userInterfacePluginDir/scripts/_GrailsGenerateService.groovy")
target ('default': "Generates the service for a specified domain class") {
depends(checkVersion, parseArguments, packageApp)
promptForName(type: "Domain Class")
generateForName = argsMap["params"][0]
generateServiceForOne()
}
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.scaffolding.*
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.FileSystemResource;
import grails.util.GrailsNameUtils
/**
* Gant script that generates a service for a given domain class
*
* @author Martín Caballero
*
*/
includeTargets << grailsScript("_GrailsBootstrap")
generateForName = null
target(generateServiceForOne: "Generates service for only one domain class.") {
depends(loadApp)
def name = generateForName
name = name.indexOf('.') > 0 ? name : GrailsNameUtils.getClassNameRepresentation(name)
def domainClass = grailsApp.getDomainClass(name)
if (!domainClass) {
grailsConsole.updateStatus "Domain class not found in grails-app/domain, trying hibernate mapped classes..."
bootstrap()
domainClass = grailsApp.getDomainClass(name)
}
if (domainClass) {
generateServiceForDomainClass(domainClass)
event("StatusFinal", ["Finished generation for domain class ${domainClass.fullName}"])
}
else {
event("StatusFinal", ["No domain class found for name ${name}. Please try again and enter a valid domain class name"])
exit(1)
}
}
def generateServiceForDomainClass(domainClass) {
UserInterfaceTemplateGenerator = classLoader.loadClass('plugin.ui.scaffold.UserInterfaceTemplateGenerator')
def templateGenerator = UserInterfaceTemplateGenerator.newInstance(classLoader)
templateGenerator.grailsApplication = grailsApp
templateGenerator.pluginManager = pluginManager
event("StatusUpdate", ["Generating service for domain class ${domainClass.fullName}"])
templateGenerator.generateService(domainClass, basedir)
event("GenerateServiceEnd", [domainClass.fullName])
}
<%import org.codehaus.groovy.grails.commons.GrailsClassUtils;%>
<%=packageName ? "package ${packageName}\n\n" : ''%>
class ${className}Service {
def getTable() {
def query = {
<%
def searchFields = GrailsClassUtils.getStaticPropertyValue(domainClass.clazz, 'search' )
if(searchFields)
{
%>
if (params.q) {
or{
<%searchFields.each { field ->%>
ilike("${field}", '%' + params.q + '%')
<%}%>
}
}
<% } %>
if (params.sort){
order(params.sort,params.order)
}
}
def criteria = ${className}.createCriteria()
return criteria.list(query, max: params.max, offset: params.offset)
}
}
我终于完成了
这是您想要做的一个示例:
这是我的实现:
*将$userInterfacePluginDir更改为您的插件名称
将此文件放入脚本中:
GenerateService.groovy
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsCreateArtifacts")
includeTargets << new File("$userInterfacePluginDir/scripts/_GrailsGenerateService.groovy")
target ('default': "Generates the service for a specified domain class") {
depends(checkVersion, parseArguments, packageApp)
promptForName(type: "Domain Class")
generateForName = argsMap["params"][0]
generateServiceForOne()
}
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.scaffolding.*
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.FileSystemResource;
import grails.util.GrailsNameUtils
/**
* Gant script that generates a service for a given domain class
*
* @author Martín Caballero
*
*/
includeTargets << grailsScript("_GrailsBootstrap")
generateForName = null
target(generateServiceForOne: "Generates service for only one domain class.") {
depends(loadApp)
def name = generateForName
name = name.indexOf('.') > 0 ? name : GrailsNameUtils.getClassNameRepresentation(name)
def domainClass = grailsApp.getDomainClass(name)
if (!domainClass) {
grailsConsole.updateStatus "Domain class not found in grails-app/domain, trying hibernate mapped classes..."
bootstrap()
domainClass = grailsApp.getDomainClass(name)
}
if (domainClass) {
generateServiceForDomainClass(domainClass)
event("StatusFinal", ["Finished generation for domain class ${domainClass.fullName}"])
}
else {
event("StatusFinal", ["No domain class found for name ${name}. Please try again and enter a valid domain class name"])
exit(1)
}
}
def generateServiceForDomainClass(domainClass) {
UserInterfaceTemplateGenerator = classLoader.loadClass('plugin.ui.scaffold.UserInterfaceTemplateGenerator')
def templateGenerator = UserInterfaceTemplateGenerator.newInstance(classLoader)
templateGenerator.grailsApplication = grailsApp
templateGenerator.pluginManager = pluginManager
event("StatusUpdate", ["Generating service for domain class ${domainClass.fullName}"])
templateGenerator.generateService(domainClass, basedir)
event("GenerateServiceEnd", [domainClass.fullName])
}
<%import org.codehaus.groovy.grails.commons.GrailsClassUtils;%>
<%=packageName ? "package ${packageName}\n\n" : ''%>
class ${className}Service {
def getTable() {
def query = {
<%
def searchFields = GrailsClassUtils.getStaticPropertyValue(domainClass.clazz, 'search' )
if(searchFields)
{
%>
if (params.q) {
or{
<%searchFields.each { field ->%>
ilike("${field}", '%' + params.q + '%')
<%}%>
}
}
<% } %>
if (params.sort){
order(params.sort,params.order)
}
}
def criteria = ${className}.createCriteria()
return criteria.list(query, max: params.max, offset: params.offset)
}
}
最后,这是我的模板:(将其放入src/templates/scaffolding/)
Service.groovy
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsCreateArtifacts")
includeTargets << new File("$userInterfacePluginDir/scripts/_GrailsGenerateService.groovy")
target ('default': "Generates the service for a specified domain class") {
depends(checkVersion, parseArguments, packageApp)
promptForName(type: "Domain Class")
generateForName = argsMap["params"][0]
generateServiceForOne()
}
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.scaffolding.*
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.FileSystemResource;
import grails.util.GrailsNameUtils
/**
* Gant script that generates a service for a given domain class
*
* @author Martín Caballero
*
*/
includeTargets << grailsScript("_GrailsBootstrap")
generateForName = null
target(generateServiceForOne: "Generates service for only one domain class.") {
depends(loadApp)
def name = generateForName
name = name.indexOf('.') > 0 ? name : GrailsNameUtils.getClassNameRepresentation(name)
def domainClass = grailsApp.getDomainClass(name)
if (!domainClass) {
grailsConsole.updateStatus "Domain class not found in grails-app/domain, trying hibernate mapped classes..."
bootstrap()
domainClass = grailsApp.getDomainClass(name)
}
if (domainClass) {
generateServiceForDomainClass(domainClass)
event("StatusFinal", ["Finished generation for domain class ${domainClass.fullName}"])
}
else {
event("StatusFinal", ["No domain class found for name ${name}. Please try again and enter a valid domain class name"])
exit(1)
}
}
def generateServiceForDomainClass(domainClass) {
UserInterfaceTemplateGenerator = classLoader.loadClass('plugin.ui.scaffold.UserInterfaceTemplateGenerator')
def templateGenerator = UserInterfaceTemplateGenerator.newInstance(classLoader)
templateGenerator.grailsApplication = grailsApp
templateGenerator.pluginManager = pluginManager
event("StatusUpdate", ["Generating service for domain class ${domainClass.fullName}"])
templateGenerator.generateService(domainClass, basedir)
event("GenerateServiceEnd", [domainClass.fullName])
}
<%import org.codehaus.groovy.grails.commons.GrailsClassUtils;%>
<%=packageName ? "package ${packageName}\n\n" : ''%>
class ${className}Service {
def getTable() {
def query = {
<%
def searchFields = GrailsClassUtils.getStaticPropertyValue(domainClass.clazz, 'search' )
if(searchFields)
{
%>
if (params.q) {
or{
<%searchFields.each { field ->%>
ilike("${field}", '%' + params.q + '%')
<%}%>
}
}
<% } %>
if (params.sort){
order(params.sort,params.order)
}
}
def criteria = ${className}.createCriteria()
return criteria.list(query, max: params.max, offset: params.offset)
}
}
我也在努力解决同样的问题。我认为这是一条路要走,但我还没有时间去尝试:我正在与同样的问题作斗争。我认为这是一条路,但我还没有时间去尝试:我会尽快尝试,并通知你。谢谢你的回复和努力:-)它对我有用。为了重构一些东西,我对此做了一些修改,但代码很好。您可以按自己喜欢的方式更改服务模板。我的脚本现在接受一个插件参数,用于在指定的插件中生成服务(用于插件中的模块化应用)。我还为此在Jira中提交了一个补丁:我将尽快尝试,并会通知您。谢谢你的回复和努力:-)它对我有用。为了重构一些东西,我对此做了一些修改,但代码很好。您可以按自己喜欢的方式更改服务模板。我的脚本现在接受一个plugin参数,用于在指定的插件中生成服务(用于插件中的模块化应用)。我还为此在Jira中提交了一个补丁: