Grails: скопируйте файл из приложения grails в каталог веб-приложения во время начальной загрузки.

У меня есть несколько файлов в определенной папке в каталоге grails-app. Во время начальной загрузки я хотел бы скопировать один из этих файлов (скажем, последний, не имеет значения) и скопировать его в папку веб-приложения, чтобы сделать его доступным для приложения grails.

Как бы Вы это сделали? Я написал что-то вроде этого:

class BootStrap {
    GrailsApplication grailsApplication

    def init = { servletContext ->
        // ...

        def source = new File('grails-app/myFolder/my-file-'+ grailsApplication.metadata.getApplicationVersion() +'.txt')
        def destination = new File('web-app/my-current-file.txt')

        source?.withInputStream { is ->
            destination << is
        }

        // ... 
    }
}

Но мне трудно определить правильный путь для исходного и целевого файлов (получение исключения FileNotFoundException). Я уже дважды проверил имена папок и файлов, моя проблема - отправная точка для относительных путей.

Является ли начальная загрузка хорошим местом для выполнения такой операции?

Как всегда, заранее спасибо.


person lucke84    schedule 02.01.2013    source источник


Ответы (2)


Как насчет подключения к событиям Grails. В настоящее время в рамках этапа компиляции проекта я копирую свой внешний файл конфигурации из папки conf в путь к классу. Таким образом, вы можете сделать что-то подобное.

Вот что у меня есть в файле _Events.groovy: я думаю, вы можете сделать что-то подобное.

eventCompileEnd = {
ant.copy(todir:classesDirPath) {
  fileset(file:"${basedir}/grails-app/conf/override.properties")
}}
person Muein Muzamil    schedule 02.01.2013
comment
Я создал файл _Events.groovy в папке сценария со строкой журнала, и событие endCompileEnd было запущено правильно, но я не смог выполнить копию. Я сделал это с помощью начальной загрузки, сегодня позже я собираюсь дать ответ со своим собственным решением, но мне очень нравится использовать этот подход. Вопрос: classDirPath является предварительно заполненным значением, как и baseir? Соответствует ли он уровню папки (развернутого) веб-приложения? - person lucke84; 03.01.2013
comment
Хорошо, я сделал это с вашим решением. Я опубликовал свой ответ, чтобы показать два разных подхода. Спасибо! - person lucke84; 03.01.2013

Я сделал это с помощью Bootstrap (пожалуйста, прочитайте весь ответ):

class BootStrap {
    GrailsApplication grailsApplication

    def init = { servletContext ->    
        def applicationContext = grailsApplication.mainContext
        String basePath = applicationContext.getResource("/").getFile().toString()

        File source = new File("${basePath}/../grails-app/myFolder/" + grailsApplication.metadata.getApplicationVersion() +'.txt')
        File destination = new File("${basePath}/my-current-file.txt")

        source?.withInputStream {
            destination << it
        }
    }
}

Но, как предлагает Муейн Музамиль, лучший подход — это события. Вот его решение, примененное к моему примеру:

eventCompileEnd = {
    metadata = grails.util.Metadata.getCurrent()
    appVersion = metadata."app.version"

    ant.copy(file: "${basedir}/grails-app/myFolder/${appVersion}.txt", tofile: "${basedir}/web-app/my-current-file.txt")
}
person lucke84    schedule 03.01.2013