2016-03-04 8 views
0

Я разработал простое приложение, используя Sparkjava. Я использую Intellij, и когда я запускаю свои тесты или запускаю приложение локально, все мои ресурсы являются файлами.Есть ли более простой способ читать * .jar или файловую систему?

Однако при развертывании все это работает как файл jar. Как таковой, мне нужен способ читать мои ресурсы с файловой системы или банки, в зависимости от того, как приложение запускается. Следующий код выполняет свою работу, но выглядит неуклюже:

String startedOffFile = new java.io.File(Main.class.getProtectionDomain() 
     .getCodeSource() 
     .getLocation() 
     .getPath()) 
     .getName(); 
InputStream inputStream; 
if(startedOffFile.endsWith(".jar")) { 
    ClassLoader cl = PropertiesParser.class.getClassLoader(); 
    inputStream = cl.getResourceAsStream("myapp.dev.properties"); 
} else { 
    inputStream = new FileInputStream(filename); 
} 

Есть ли более чистый/простой способ?

+0

Выглядит хорошо для меня. –

+5

Почему бы не всегда загружать ресурсы из пути к классам (т. Е. С помощью ClassLoader.getResourceAsStream()), а не использовать файл IO? Независимо от того, находятся ли ресурсы в каталоге, который находится в пути к классам или в банке, которая находится в пути к классам, не имеет значения для вашего кода. –

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29 –

ответ

1

Если вы используете Maven с IntelliJ, просто поместите конфигурации свойства файла внутри src/main/resources директории в модуле. Если вы не используете Maven, поместите файл свойств в корень вашего исходного дерева (вне любого пакета - например: src/myapp.dev.properties).

После упаковки/экспорта JAR файл будет доступен с new Object().getClass().getClassLoader().getResourceAsStream("myapp.dev.properties") (используется new Object()..., поскольку в некоторых случаях/платформах статический ClassLoader не определен).

Тот же путь класса используется средой IntelliJ/Eclipse, что означает, что нет необходимости в специальном случае для загрузки файлов.

Если вам необходимо провести различие между разработкой и производством. Вы можете использовать профили Maven для упаковки времени сборки, или вы можете загрузить свойства с помощью переменной -D.

+0

Использование maven для создания конкретных Jars для определенных сред не является хорошей идеей. Мир давно двинулся. Непрерывное развертывание, развертывание DevOps и Container лучше всего работают при экстернализации вашей конфигурации и реагировании на ваш код. –

+0

Вопрос не указывает тип приложения. Это может быть рабочий стол, не забывайте, что это довольно распространенный тип приложений, где DevOps, контейнеры и концепции развертывания нового возраста отсутствуют. Второе, что нужно отметить, - это настоящая проблема, загрузка одной и той же конфигурации при выполнении тестов в IntelliJ и в виде отдельного JAR-файла. Наконец, ответ явно предлагает вариант -D переопределить файл свойств. – sahel

+0

DevOps работает во всех типах приложений, включая настольные компьютеры. Ничего нового о непрерывном развертывании. Этот вопрос касается веб-сервера. Создание разных Jars (настольных или других) с использованием Maven не является ошибкой, но может привести к проблемам. Создание единого Jar для всех развертываний, в том числе IntelliJ, является лучшим вариантом, поскольку он упрощает кодовую базу. –

2

Создайте этот тип, чтобы определить, был ли ваш исполняемый файл java определен параметром config.location или будет выглядеть по пути к классам.

например. java -Dconfig.location=/here/myapp.dev.properties -jar youapp.jar

public class ApplicationProperties { 
    public ApplicationProperties() throws IOException { 
     final Properties properties = new Properties(); 

     String location = getProperty("config.location") 
     if(location != null) { 
      properties.load(new FileInputStream(getProperty("config.location", ENV_PROPERTIES_PATH))); 
     } else { 
      properties.load(Classname.class.getClassLoader().getResourceAsStream("myapp.dev.properties")); 
     } 
    } 

    public Properties getProperties() { 
     return properties; 
    } 
} 
Смежные вопросы