Подтвердить что ты не робот

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

Я создаю настольное приложение Java, используя JavaFX, Gradle, javafx- gradle -plugin. Это приложение подключается к серверу, который я также создаю. Когда я компилирую версию выпуска, запустив gradle jfxNative, я хочу, чтобы она говорила с производственным сервером; но в противном случае я хочу, чтобы он разговаривал с localhost.

Каков правильный способ работы с Java/ Gradle? Какой-то профиль компиляции?

4b9b3361

Ответ 1

Простейшее решение: укажите файл конфигурации, содержащий такую ​​информацию. Вы либо скомпилируете его в приложение как ресурс java, либо разместите его рядом с файлом jar, чтобы его можно было легко найти через файловую систему.

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

application.properties в src/main/resources:

server.address=${serverAddress}

добавить в свой build.gradle

task setProductionServerAddress {
    processResources.expand([serverAddress: "https://app.example.com/v1"])
}
jfxJar.dependsOn(setProductionServerAddress)
jfxNative.dependsOn(setProductionServerAddress)

И затем в приложении:

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("/application.properties"));
if (properties.getProperty("server.address").equals("${serverAddress}")) {
  setUrl("http://localhost:8080/v1");
} else {
  setUrl(properties.getProperty("server.address"));
}

Ответ 2

Вы можете использовать Gradle исходные наборы для этого:

Пример build.gradle:

apply plugin: 'java'

sourceSets {
    prod {
        java {
            srcDirs = ['src/main/java', 'src/prod/java']
        }
    }
    dev {
        java {
            srcDirs = ['src/main/java', 'src/dev/java']
        }
    }
}

task devJar(type: Jar) {
    from sourceSets.dev.output
    manifest {
        attributes("Main-Class": "MyPackage.MyClass")
    }
}

task prodJar(type: Jar) {
    from sourceSets.prod.output
    manifest {
        attributes("Main-Class": "MyPackage.MyClass")
    }
}

Теперь вы можете создать два класса конфигурации для своих версий dev и prod: src/dev/java/MyPackage/Configuration.java
src/prod/java/MyPackage/Configuration.java

Весь общий код будет в основном источнике:
src/main/java/MyPackage/MyClass.java

MyClass может получить некоторые значения из класса конфигурации (например, Configuration.getBaseUrl())

Запуск gradle devJar/gradle prodJar создает один из вариантов.

Примечание: вам может потребоваться расширить jfxNative/jfxJar вместо Jar в вашем случае.

Ответ 3

Попросите проверить переменные среды для имен файлов конфигурации. Ничего общего с gradle или build. Эта же программа должна работать правильно везде, где она развернута.

См., например, Свойства для dev и production

Самый простой подход - определить системное свойство, которое определяет, где находится местоположение файловой системы для ваших данных. Рабочий сервер приложений определит одно значение (используя java -D в startup script), а ваш сервер приложений Dev определит другое значение. Ваш источник приложения будет обращаться к значению системного свойства (используя System.getProperty()), чтобы обнаружить подходящее местоположение

Кроме того, это имеет смысл.

Поместите необходимую информацию в JNDI - то, для чего она предназначена.   Подумайте о том, чтобы ваша заявка отказывалась что-либо делать, если информация там отсутствует.

Еще одна ссылка: Каков наилучший способ управления данными конфигурации

EDIT: Ну, то, что вы просите, логически невозможно, мне кажется. "Он должен подключаться к производству, если только кто-то не хочет подключиться к разработке, но эта функция должна быть доступна только неизвестным". Меню "Пуск" - это всего лишь ярлык для запуска приложения, поэтому вы можете установить ярлык "dev" с помощью параметры командной строки, которые считываются как окружения vars.

Ответ 4

Я бы воспользовался одним из концепций "12-факторного приложения, который можно прочитать здесь

Одна из его основных концепций - использовать переменную системной среды, которая должна определять, работаете ли вы на prod или dev или qa env и т.д. каждый проект/среда/машина должен содержать свое соответствующее свойство env, которое после этого может быть извлечено через процесс gradle, подобный плагину профиля maven.

Пример обнаружения:

`if (project.hasProperty('env') && project.getProperty('env') == 'prod') {
    apply from: 'gradle/production.gradle'
} else {
    apply from: 'gradle/development.gradle'
}`

подробнее об этом подходе с использованием gradle можно найти: gradle профиль

Ответ 5

Вам нужно выбрать схему конфигурации (если JavaFX не выбрал для вас).

Мне нравится https://github.com/typesafehub/config.

Конфигурационная библиотека будет иметь инструкции о том, как сделать конфигурацию вашего "производства" отличной от вашей конфигурации "разработки".

См. также JavaFX: редактируемые файлы конфигурации после упаковки

Какой правильный способ работы с Java/ Gradle? Какой-то профиль компиляции?

Нет, я бы настоятельно рекомендовал не компилировать разные код для производства v.s. контрольная работа. Это приведет к аннулированию вашего тестирования. Это нужно обрабатывать в конфигурации, а не в коде. Обычный способ Java - это файлы конфигурации (которые могут быть скомпилированы в JAR как ресурсы).

Как это сделать с помощью Configafe Config

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

Я бы сделал что-то вроде этого:

Мое предположение о том, почему для этого мало учебников, все приложения или веб-платформы обрабатывают это для вас.

Ответ 6

По моему мнению, и, как и другие, предположили, это имеет мало общего со сборкой и больше связано с Run Time.

Поэтому вы можете прибегнуть к проверке определенного флага времени выполнения - удобный и часто используемый подход заключается в использовании свойств системы.

В вашем блоке Dev вы можете установить переменную среды - скажем, FX _DESKTOP_APP_ENV = DEV или некоторые такие.

Из вашего кода вы можете посмотреть это и решить, какой URL вы хотите использовать.

String env = System.getenv("FX _DESKTOP_APP_ENV");
String url = env == null ? "Production" : env;

В системах Windows вы можете настроить переменные вашей системной среды следующим образом: введите ссылку здесь

В системах * nix введите ссылку здесь

Надеюсь, что это поможет