Как получить абсолютный путь с помощью Vert.x?

Как я могу получить абсолютный путь к файлу без жесткого кодирования пути в строке?

Итак, в основном я прошу версию PHP $_SERVER['DOCUMENT_ROOT'] для vert.x. Кто-нибудь знает?


ОБНОВЛЕНИЕ
У меня есть следующая структура каталогов:

| app.coffee
| Views
  -| foo.html 

приложение.кофе:

vertx = require('vertx')
rm    = new vertx.RouteMatcher()

rm.get '/', (req) ->
    req.response.sendFile "Views/foo.html"

vertx.createHttpServer().requestHandler(rm).listen(8080)

person Stephan    schedule 28.06.2014    source источник


Ответы (3)


Похоже, вы ищете каталог выполнения приложения. Чтобы получить каталог выполнения, вы можете просто найти системное свойство «user.dir» следующим образом:

System.getProperty("user.dir")

Так, например, когда я использую статические файлы в vertx для тестирования, я использую это:

val staticFilePath = container.config().getString("static_files", System.getProperty("user.dir"));
  server.requestHandler(
  {
    request: HttpServerRequest => {
      request.response().sendFile(staticFilePath + "/something.css")
    }
  }

Если вы все еще не получаете желаемого результата, просто распечатайте свойство user.dir, чтобы увидеть, откуда вы пытаетесь обслуживать файлы.

Рекомендации:

person Kevin Bayes    schedule 26.09.2014
comment
Да! Это было именно то, что я искал! Спасибо, Кевин. - person Stephan; 26.09.2014
comment
Не проблема. Рад помочь. - person Kevin Bayes; 26.09.2014

Просто введите относительный путь, он будет относиться к рабочему каталогу, в который вы запустили команду vertx.

Посмотрите на этот простой пример:

$ ls
index.html  verticle.scala

Как видите, у меня есть вертикаль и статический файл в моей (неуказанной!) директории.

$ cat index.html
Hello!

$ cat verticle.scala
vertx.createHttpServer().requestHandler({ req: HttpServerRequest =>
    req.response().sendFile("index.html") // <-- relative path!
}).listen(8080)

Теперь я просто запускаю его отсюда

$ vertx run verticle.scala
Compiling verticle.scala as Scala script
Starting verticle.scala
Succeeded in deploying verticle

И это просто работает, вообще не нужно указывать константы, как в PHP :)

$ curl localhost:8080
Hello!

Наслаждаться!

person sscarduzio    schedule 29.06.2014
comment
Это то, что я пробовал, но относительный путь, похоже, не работает для меня. Или я просто делаю это неправильно. Проверьте мой обновленный вопрос. - person Stephan; 02.07.2014

Бьюсь об заклад, вы пытаетесь сделать

curl http://localhost:8080/foo.html

Это не может работать, потому что ваш сопоставитель маршрутов настроен на соответствие / и отвечает содержимым foo.html.

Правильный тестовый пример должен быть вместо этого:

curl http://localhost:8080/

и ожидаемый результат должен быть

Hello!

Сопоставитель маршрутов не является неправильным инструментом для обслуживания статических файлов. Если вы собираетесь это сделать, обратитесь к модуль веб-сервера

ОБНОВЛЕНИЕ

Приятель, у меня эта штука работает и в coffeescript. Какую версию Vert.x вы используете?

$ vertx version
2.1 (built 2014-05-27 12:39:02)
$ cat app.coffee
vertx = require('vertx')
rm    = new vertx.RouteMatcher()

rm.get '/', (req) ->
    req.response.sendFile "Views/foo.html"

vertx.createHttpServer().requestHandler(rm).listen(8080)
$ vertx run app.coffee &
[1] 27731
$ Succeeded in deploying verticle

$ curl localhost:8080
ciao
$ cat Views/foo.html
ciao
person sscarduzio    schedule 02.07.2014
comment
Спасибо за быстрый ответ, еще раз. Но я знаю, как работает routeMatcher. Когда я делаю curl -i http://localhost:8080/, я получаю 404: Resource not found. Я читал документы, пробовал примеры, но относительные пути мне не подходят. Однако, когда я указываю абсолютный путь, он действительно работает. Вот почему я хотел бы знать, как получить путь к текущему файлу, чтобы предотвратить жесткое кодирование. - person Stephan; 02.07.2014
comment
Можете ли вы воспроизвести это с помощью версии вашей программы, переведенной на Javascript? - person sscarduzio; 02.07.2014