завершите работу рычага для веб-приложения Java

Это слишком сложно сделать в комментариях, поэтому я просто собираюсь быстро продемонстрировать вам, какие проблемы связывания у вас возникают. Когда XCode встречает файлы, он использует правила сборки, основанные на суффиксе, чтобы решить, какой компилятор использовать. По умолчанию gcc связывает файлы со стандартной библиотекой C, но не связывает со стандартной библиотекой C ++. Архивные файлы (статические библиотеки) вообще не имеют разрешения на связывание. В основном это архив объектных файлов, с которыми необходимо связать . Поскольку в вашем проекте нет файлов .mm или .cpp, g ++ никогда не вызывается, а ваши файлы никогда не связаны со стандартными библиотеками. Чтобы исправить это, просто добавьте стандартные библиотеки C ++ к другим вашим флагам компоновщика в вашем проекте XCode или просто добавьте их в предопределенную опцию других флагов как -l (например, -lstdc ++).

Вот краткая демонстрация:

stw.h:

#ifdef __cplusplus
extern "C"
#endif
void show_the_world(void);

stw.cpp:

#include <iostream>
#include "stw.h"
using namespace std;

extern "C" void show_the_world() {
  cout << "Hello, world!\n";
}

Сборка библиотеки:

$ g++ -c stw.cpp -o stw.cpp -O0 -g
$ ar rcs stw.a stw.o

Использование библиотеки из приложения C:

myapp.c:

#include "stw.h"

int main() {
  show_the_world();
  return 0;
}

Сборка приложения C:

$ gcc -o myapp myapp.c stw.a -lstdc++ -g -O0
$ ./myapp
Hello, world!
$

Если вы попытаетесь скомпилировать без -lstdc ++ вы получите все нерешенные проблемы, потому что компилятор C не имеет абсолютно никакого представления о том, что он должен ссылаться на среду выполнения C ++ (и почему это так, верно!?!?), поэтому вы должны добавить это вручную. Другой вариант, который у вас есть, это изменить правило сборки для вашего проекта ... вместо того, чтобы Xcode использовал gcc для сборки файлов .c и .m, скажите ему использовать g ++, и ваши проблемы будут решены.

38
задан user121196 11 October 2009 в 06:59
поделиться

3 ответа

Use a class that implements ServletContextListener in your web.xml:

<web-app>
    <!-- Usual stuff here -->
    <listener>
        <listener-class>com.mycompany.MyClass</listener-class>
    </listener>
</web-app>
52
ответ дан 27 November 2019 в 03:26
поделиться

Почему вы хотите делать это именно во время выключения? И вам действительно нужен , чтобы сохранить его (например, «это абсолютно критично?»), Или вы хотели бы (например, «было бы неплохо, но я проживу без него») ")?

Различие важно - независимо от того, какой метод вы пробуете (сервлет / прослушиватель контекста, как предложено другими ответами или обработчик выключения JVM ), нет никаких гарантий , что он будет фактически вызван.

События уничтожения сервлета / прослушивателя контекста будут запускаться только во время нормального (постепенного) завершения работы контейнера ИЛИ во время перезагрузки приложения. Хук завершения работы JVM также будет срабатывать во время прерывания процесса; однако убийство процесса (или отключение питания), очевидно, не приведет ни к одному из них.

15
ответ дан 27 November 2019 в 03:26
поделиться

Я предлагаю использовать ehcache для кеширования этой информации. Если вы используете постоянное хранилище ehcache, то при повторном запуске Tomcat кэшированные данные будут по-прежнему доступны.

Фактически, это делегирует проблему ehcache, который оптимизирован для этих типов проблем.

3
ответ дан 27 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

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