我想在Grails中添加基于Linux或基于Windows的系统属性,因为我的应用需要在两者中运行。我知道我们可以添加Config中指定的grails.config.locations位置。常规。
但我需要选择文件的if和esle条件。 问题是config.grrovy有userHome grailsHome appName appVersion 我需要像osName这样的东西。 我可以继续使用syetm.properties,或者如果soembody可以告诉我这些(仅)属性在Config.groovy中是如何使用的(通过DefaultGrailsApplication或其他方式。那么woyuld很棒。
另外,如果我需要这些属性,我会将服务作为用户定义的spring-bean。这是正确和可行的方法吗?如果是,那么一些例子
答案 0 :(得分:0)
为Windows和Linux创建自定义环境。如果放在config.groovy
中,以下内容应该有效 environments {
productionWindows {
filePath=c:\path
}
productionLinux {
filePath=/var/dir
}
}
然后,您应该能够使用grails配置对象来获取filePath的值,无论您在Windows或Linux上的天气如何。有关详细信息,请参阅第3.2节 http://www.grails.org/doc/1.0.x/guide/3.%20Configuration.html如果你想创建一个在Linux上运行的war文件,你可以执行以下命令。
grails -Dgrails.env=productionLinux war
然后获取存储在config.groovy中的文件路径,以了解您正在运行的特定环境。
def fileToOpen=Conf.config.filePath
fileToOpen将包含您在config.groovy中根据当前运行环境分配给filePath的值,因此当使用productionLinux作为环境运行时,它将包含值/ var / dir
答案 1 :(得分:0)
您可以在Config.groovy
中执行以下操作:
environments {
development {
if (System.properties["os.name"] == "Linux") {
grails.config.locations = [ "file:$basedir/grails-app/conf/linux.properties" ]
} else {
grails.config.locations = [ "file:$basedir/grails-app/conf/windows.properties" ]
}
}
...
}
或者,对于基于服务的方法,您可以将所有特定于操作系统的行为捆绑到服务接口的实现中。例如:
// OsPrinterService.groovy
interface OsPrinterService {
void printOs();
}
// LinuxOsPrinterService.groovy
class LinuxOsPrinterService implements OsPrinterService {
void printOs() { println "Linux" }
}
// WindowsOsPrinterService.groovy
class WindowsOsPrinterService implements OsPrinterService {
void printOs() { println "Windows" }
}
然后在grails-app/conf/spring/resources.groovy
中实例化正确的那样:
beans = {
if (System.properties["os.name"] == "Linux") {
osPrinterService(LinuxOsPrinterService) {}
} else {
osPrinterService(WindowsOsPrinterService) {}
}
}
然后春天会自动将正确的服务注入你的对象。