системное свойство grails base.dir - PullRequest
5 голосов
/ 20 февраля 2009

У меня есть простое приложение для загрузки файлов Grails.

Я использую TransferTo для сохранения файла в файловой системе.

Чтобы получить базовый путь в моем контроллере, я использую

def basePath = System.properties['base.dir'] // HERE IS HOW I GET IT

        println "Getting new file"
        println "copying file to "+basePath+"/files"
        def f = request.getFile('file')
        def okcontents = ['application/zip','application/x-zip-compressed']
        if (! okcontents.contains(f.getContentType())) {
            flash.message = "File must be of a valid zip archive"
            render(view:'create', model:[zone:create])
            return;
        }
              if(!f.empty) {
                  f.transferTo( new File(basePath+"/files/"+zoneInstance.title+".zip") )
              }
              else 
              {
                  flash.message = 'file cannot be empty'
                      redirect(action:'upload')
              }
        println "Done getting new file"

По какой-то причине при развертывании на моем сервере WAS 6.1 это всегда равно нулю.

Почему это работает при запуске dev, но не в prod на WAS-сервере? Должен ли я получить доступ к этой информации по-другому?

Ответы [ 4 ]

4 голосов
/ 20 февраля 2009

Спасибо, J,

Я нашел лучшее динамическое решение из возможных. Как правило, мне никогда не нравится кодировать абсолютные пути в какой-либо части программного обеспечения. Файл собственности или нет.

Итак, вот как это делается:

def basePath = grailsAttributes.getApplicationContext().getResource("/files/").getFile().toString() 

grailsAttributes доступен в любом контроллере.

getResource (некоторый относительный каталог) будет искать что-нибудь внутри папки веб-приложения.

Так, например, в моей системе разработки он будет выводить строку "C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \" с относительным dir, связанным с концом

как в моем примере выше C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ веб-приложение \ файлы

Я пробовал в WAS 6.1, и он работал в контейнере без проблем. Вы должны выполнить toString, иначе он попытается вернуть объект.

mugafuga

4 голосов
/ 19 августа 2010

Есть определенный путь ...

grailsApplication.parentContext.getResource("dir/or/file").file.toString()

Нет контроллеров (например, начальная загрузка)? Просто введите ...

def grailsApplication

С наилучшими пожеланиями!

3 голосов
/ 20 февраля 2009

Grails, когда он запускается в режиме разработки, предоставляет целый ряд свойств среды для своих сценариев Gant и приложения по очереди, включая basedir.

Посмотрите на скрипт grails.bat или grails.sh , и вы найдете следующие строки:

Unix: -Dbase.dir="." \
Windows: set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir="."

Когда эти скрипты запускают вашу среду в режиме разработки, вы получаете их бесплатно.

Когда вы берете WAR и развертываете, вы больше не используете эти сценарии, и поэтому вам нужно решить проблему другим способом; Вы можете либо

  1. Укажите свойство самостоятельно для сценария запуска сервера приложений, например: -Dbase.dir =. / Some / dir .. однако
2 голосов
/ 06 июня 2012

Другой вариант:

def basePath = BuildSettingsHolder.settings.baseDir

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...