Как получить txt-файл из jar в tomcat7

У меня есть файл txt . Я упаковал его в zip и jar, используя jar cf0 ... . Я пробовал оба в попытке заставить это работать.

models.zip/models.jar
 |
 |_subfolder
     |
     |_MyFile.txt

В некотором коде у меня есть ...

InputStream in = getClass().getClassLoader().getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

Я попытался установить путь к ...

MyFile.txt
/MyFile.txt
/subfolder/MyFile.txt
classpath:/subfolder/MyFile.txt
models.zip/subfolder/MyFile.txt
models.jar/subfolder/MyFile.txt
models.zip!/subfolder/MyFile.txt
models.jar!/subfolder/MyFile.txt

Я также попытался помещать jar/zip в WEB-INF/classes и WEB-INF/lib .

Ничего из этого не работает, in всегда равно null.

И просто, чтобы вы знали, когда я помещаю MyFile.txt в WEB-INF/classes, я могу получить все в порядке.

Пожалуйста, попробуйте проверенный ответ! Пожалуйста, не копируйте и не вставляете код из другого ответа.

2
nl ja de
Есть ли подчеркивание перед именем файла? Если это так, вам нужно включить это в путь.
добавлено автор Triton Man, источник
Я беру это ваши модели. {Jar, zip} не находится в пути к классам?
добавлено автор fge, источник
@TedTrippin «Я считаю, что lib и классы оба находятся в пути Tomcat class» <- Я говорил о ваших моделях. * Файл здесь. Если он был в пути к классам, он был zip-файлом и имел расширение .jar , .getResourceAsStream() нашел бы файл.
добавлено автор fge, источник
просто чтобы быть уверенным, можете ли вы добавить точный вывод «jar tvf models.jar»?
добавлено автор BigMike, источник
@TedTrippin, может быть, в банке не содержится файл ...
добавлено автор ElderMael, источник
Можете ли вы опубликовать структуру каталогов вашего приложения? и если вы можете содержимое банки?
добавлено автор ElderMael, источник
Да, когда я получаю getResourceAsStream ("models.jar"), он возвращает банку.
добавлено автор TedTrippin, источник
fge - Я считаю, что lib и классы находятся в пути Tomcat classpath. triton - нет подчеркивания.
добавлено автор TedTrippin, источник
возможный дубликат Получить ресурс из jar
добавлено автор Brian Roach, источник

3 ответы

Попробуйте

InputStream is = getClass().getClassLoader().getResourceAsStream  ("/subfolder/MyFile.txt");

и поместите свой файл jar в WEB-INF/lib /

EDIT: вы должны доверять своему собственному коду, это фрагмент из работающего webapp моего. Класс находится в пакете «it.sft.utils.props», а файл относительных свойств упакован через ant int в ту же самую папку той же банки. Это работает безупречно.

В вашем конкретном сценарии, вероятно, у вас нет флага в вашем пути к классам

 private void loadFromProperties() throws IOException {
            if (currencies == null) {
                currencies = new Properties();
                InputStream is = this.getClass().getClassLoader().getResourceAsStream  ("/it/sft/utils/props/currencies.props");
            if (is != null) {

                currencies.load(is );

                for (String key : currencies.stringPropertyNames()) {
                    String value = currencies.getProperty(key);
                    try {
                        String [] tmp = value.split(",");
                        String code = tmp[0];
                        int decs = Integer.parseInt(tmp[1]);
                        String text = tmp[2];
                        Logger.getLogger(CurrencyResolver.class).debug("Adding " + key + " with code " + code + " [" + text + "]");
                        storeValutaIso4217(new ValutaIso4217(key, code, decs, text));
                    }catch (Exception e) {
                       //Ignore
                        Logger.getLogger(CurrencyResolver.class).warn("Cannot handle " + key + " >" + value + "<");
                    }
                }
            }
        }
    }

Или вы случайно запускаете его из каких-либо IDE (NetBeans или Eclipse)?

Просто для того, чтобы быть параноидальным: файл jar на самом деле читается пользователем пользователя tomcat, не так ли?

2
добавлено
@TedTrippin вы развертываете приложение как войну, как ухо или как каталог? код прав, и ИТ должен работать.
добавлено автор BigMike, источник
@kutschkem Я согласен с тобой.
добавлено автор BigMike, источник
@TedTrippin странно, он работает в производстве на сервере JBoss AS около 2 лет.
добавлено автор BigMike, источник
-1 Я попросил не просто скопировать и вставить. И нет, это не работает.
добавлено автор TedTrippin, источник
Просто работает под tomcat как мой собственный пользователь на окнах. Если я разворачиваю текстовый файл самостоятельно, тогда проблем нет, только когда он находится в банке/zip. И jar tvf показывает файл.
добавлено автор TedTrippin, источник
«ИТ должен работать», вы правы. Проблема заключалась в том, что в обоих классах была jar и lib :(
добавлено автор TedTrippin, источник

Я думаю, что проблема заключается в завершении / в /subfolder/MyFile.txt .

Весна ClassPathResource использует почти ту же самую операцию, которую вы используете, но javadoc указывает прямо :

Создайте новый класс ClassPathResource для использования ClassLoader. Ведущая косая черта   будут удалены, поскольку методы доступа к ресурсам ClassLoader не будут   принять его.

Таким образом, без весны это было бы:

Thread.currentThread().getContextClassLoader().getResourceAsStream("subfolder/M‌​yFile.txt");

Кроме того, ваша банка должна быть помещена в WEB-INF/lib или если вы хотите поместить только текстовый файл, поместите его в WEB-INF/classes/subfolder/.

Если вы используете весну (моя догадка, потому что вы используете псевдо-url classpath :), используйте прямо следующее:

InputStream is = new ClassPathResource("subfolder/MyFile.txt").getInputStream();
1
добавлено
Я не согласен, я всегда загружал файлы свойств, расположенные в том же источнике относительных pojos, используя ведущий «/», я никогда не использовал Spring
добавлено автор BigMike, источник
@TedTrippin mmm ... затем с завершающим косой чертой? Лол
добавлено автор ElderMael, источник
Можете ли вы его с помощью Thread.currentThread (). GetContextClassLoader (). GetResourceAs & zwnj; Stream ("вложенная папка/My & zwnj; File.txt");
добавлено автор ElderMael, источник
Как уже было сказано, я попытался поместить его в папки lib и classes. Нет, не используя весну, просто пробую разные примеры, с которыми я столкнулся.
добавлено автор TedTrippin, источник
@Mael, еще ничего
добавлено автор TedTrippin, источник

Я чувствую себя плунжером! Проблема заключалась в том, что models.jar был как в папке lib, так и в классах. Он должен быть в папке lib.

1
добавлено
Это ... было неожиданным.
добавлено автор ElderMael, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async