Migrująmy system napisany w C do Java i musimy zachować istniejące procesy (brak debaty). Obecnie "osadzamy się" informacje o czasie kompilacji w aplikacji C za pomocą preprocesora C, na przykład:

cc -o xxx.o -DCOMP_ARG='"compile time arg"' xxx.c

Plik xxx.c może następnie użyć "Comp_ARG", a jego wartość zostanie osadzona w kodzie i mamy niewiele martwić się, że jest przypadkowo zmieniony.

Zdajemy sobie sprawę, że Java lubi używać plików właściwości, jednak nasze wymagania są takie, że niektóre informacje ** ** są osadzone w kodzie, więc pliki właściwości nie są opcją - te niektóre wartości nie mogą być określone w czasie wykonywania. Aby zilustrować punkt, takie dane mogą być znacznikiem daty, gdy plik został skompilowany, ale dokładne dane są nieistotne dla pytania.

Szukamy sposobu, aby określić w czasie kompilacji różne wartości dostępne dla kodu Java. Jesteśmy dość świadomi, że Java nie ma prealizatora tak jak C, więc mechanizm byłby inny.

Naszym obecnym rozwiązaniem jest użycie etapu generowania kodu (Maven), który działa, jednak zaćmienie Havoc próbuje poradzić sobie z plikami źródłowymi, dzięki czemu wyłączaliśmy "Budować automatycznie". Naprawdę chcemy znaleźć bardziej solidne rozwiązanie.

Dziękujemy za wszelką pomoc.

0
Jim 15 luty 2017, 21:48

2 odpowiedzi

Najlepsza odpowiedź

Zamierzam opublikować własną odpowiedź, która wydaje się "nie może być zrobiona" - czego nie można zrobić, najwyraźniej zapewnia w czasie kompilacji do Java, zestaw parametrów, które zostaje przekazywane do programu w wykonaniu czas. Rozwiązanie wydaje się być kontynuowane z tym, co robię, który ma zaktualizować plik źródłowy Java z danymi czasowymi i dowiedzieć się, jak COAX Eclipse, aby zatrzymać przepisywanie plików.

Dzięki wszystkim, którzy skomentowali.

0
Jim 21 luty 2017, 14:09

Plik xxx.c może następnie użyć "Comp_ARG", a jego wartość zostanie osadzona w kodzie i mamy niewiele martwić się, że jest przypadkowo zmieniony.

... Nasze wymagania są takie, że niektóre informacje są osadzone w kodzie ....

Szukamy sposobu, aby określić w czasie kompilacji różne wartości dostępne dla kodu Java. Jesteśmy dość świadomi, że Java nie ma prealizatora tak jak C, więc mechanizm byłby inny.

Wydaje się, że najlepszym sposobem na rozwiązanie tego problemu byłoby korzystanie z adnotacje w kodzie.

W Javie adnotacje są rodzajem deklaracji interfejsu, ale nie egzekwują umowy behawioralnej z klasą wykonawczym. Są one raczej przeznaczone do zdefiniowania umowy z niektórymi zewnętrznymi ramami, preprocesorem lub samym kompilatorem. Adnotacje są szeroko stosowane w Java EE 5.0 (a później), aby określić konfigurację i zachowanie do ramy, w których działa kod dewelopera. Adnotacje są również szeroko stosowane przez procesor dokumentacji Javadoc. Tutaj adnotacje w komentarzach DOC umożliwiają określenie i formatowanie informacji, które zamierzasz pojawiać się w dokumentacji, gdy procesor Javadoc działa.

Adnotacje można zdefiniować, aby być dostępnym w czasie wykonywania. W takim przypadku głównym mechanizmem dostępu do adnotacji jest obiekt odbicia Java. Na przykład, adnotacje z zasadą retencji RUNTIME i zdefiniowane w klasie można uzyskać za pomocą odpowiedniej klasy Class

Class myCls = MyClass.class;   // the "class literal" for MyClass
Annotation[] annotations = myCls.getDeclaredAnnotations();

Adnotacje mogą obejmować argumenty dla parametrów, aby umożliwić większą elastyczność w konfiguracji. Korzystanie z adnotacji jest najwygodniejsze, gdy sam kod może być tak adnotacyjny.

Szybki samouczek na temat tego, w jaki sposób adnotacje są zdefiniowane i używane w Javie jest dostępne tutaj: HTTPS: / /docs.Oracle.com/javase/tutorial/java/annotations/.

0
scottb 15 luty 2017, 23:10