Есть ли любой способ определить постоянную величину к Java во время компиляции

Я столкнулся с той же проблемой, и я решил это следующим образом:

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

    String currentEmail = MyApp.getSharedPreferences().getEmail();
    String currentPass = MyApp.getSharedPreferences().getPass();

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.createUserWithEmailAndPassword(email, pass)
            .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {

                @Override
                public void onComplete(@NonNull final Task<AuthResult> task) {

                    if (task.isSuccessful()) {
                        String currentEmail = MyApp.getSharedPreferences().getEmail();
                        String currentPass = MyApp.getSharedPreferences().getPass();

                        //Sign in again
                        auth.signInWithEmailAndPassword(currentEmail, currentPass)
                                .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                        if (!task.isSuccessful()) {
                                            Log.e("RELOGIN", "FAILED");
                                        } else {
                                            Log.e("RELOGIN", "SUCCESS");
                                        }
                                    }
                                });

                        finish();
                    }
                }
    });
12
задан Whymarrh 9 July 2017 в 23:17
поделиться

7 ответов

Я одобрил бы основанный на стандартах подход. Поместите свою информацию о версии (наряду с другим полезным материалом издателя, таким как номер сборки, число пересмотра подверсии, автор, детали компании, и т.д.) в Файле манифеста банки.

Это - хорошо зарегистрированная и понятая спецификация Java. Сильная поддержка инструмента существует для создания файлов манифеста (базовая задача Ant, например, или плагин банки знатока). Они могут помочь с установкой некоторых атрибутов автоматически - мне настроили знатока для помещения номера версии знатока банки, пересмотра Подверсии и метки времени в декларацию для меня во время изготовления.

Можно считать содержание декларации во времени выполнения со стандартными вызовами API Java - что-то как:

import java.util.jar.*;

...

JarFile myJar = new JarFile("nameOfJar.jar");    // various constructors available
Manifest manifest = myJar.getManifest();
Map<String,Attributes> manifestContents = manifest.getAttributes();

Мне, который чувствует себя подобно большему количеству подхода стандарта Java, так вероятно, окажется более легким для последующих специалистов по обслуживанию кода следовать.

15
ответ дан 2 December 2019 в 04:54
поделиться

Я не забываю видеть что-то подобное в проекте с открытым исходным кодом:

class Version... {
  public static String tstamp() {
    return "@BUILDTIME@";
  }
}

в шаблонном файле. С копией фильтрации Муравья можно дать этому макросу значение:

<copy src="templatefile" dst="Version.java" filtering="true">
    <filter token="BUILDTIME" value="${build.tstamp}" />
</copy>

используйте это для создания исходного файла Version.java в процессе сборки перед шагом компиляции.

11
ответ дан 2 December 2019 в 04:54
поделиться

AFAIK там не является способом сделать это с javac. Это может легко быть сделано с Муравьем - я создал бы объект первого класса по имени BuildTimestamp.java и генерировал бы тот файл во время компиляции через целевой объект Ant.

Вот тип Муравья, который будет полезен.

2
ответ дан 2 December 2019 в 04:54
поделиться

Если Вы не хотите выполнить свой источник Java через Препроцессор C/C++ (который является БОЛЬШИМ НЕТ - НЕТ), используйте метод банки. Существуют другие способы вытащить корректные ресурсы из банки, чтобы удостовериться, что кто-то не помещал дублирующийся ресурс на путь к классу. Вы могли также рассмотреть использование декларации Банки для этого. Мой проект делает точно, что Вы пытаетесь сделать (с датами сборки, изменениями, автором, и т.д.) использование декларации.

Вы захотите использовать это:

Enumeration<URL> resources = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");

Это получит Вас ВСЕ декларации на пути к классу. Можно выяснить, от какой банки они могут путем парсинга URL.

1
ответ дан 2 December 2019 в 04:54
поделиться

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

Но иначе Вы могли сделать это, должен будет использовать Муравья для копирования .java файлов в другой каталог прежде, чем скомпилировать их, просачиваясь Строковые константы как соответствующие. Вы могли использовать что-то как:

public String getBuildDateTime() {
    return "@BUILD_DATE_TIME@";
}

и запишите фильтр в своем файле Муравья для замены этого свойством сборки.

1
ответ дан 2 December 2019 в 04:54
поделиться

Возможно, больше стиля Java способ указать на версию Вашей библиотеки должно было бы добавить номер версии к декларации JAR, как описано в явной документации.

1
ответ дан 2 December 2019 в 04:54
поделиться

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

Я не уверен, что получение Муравья генерировать файл является ужасно вопиющим взломом, если это - взлом вообще. Почему бы не генерировать файл свойств и использование java.util. Свойства для обработки его?

0
ответ дан 2 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: