Необходимо быть очень осторожными, если Вы звоните System.gc()
. Вызов его может добавить ненужные проблемы производительности к Вашему приложению, и это, как гарантируют, на самом деле не выполнит набор. На самом деле возможно отключить явный System.gc()
через аргумент Java -XX:+DisableExplicitGC
.
я настоятельно рекомендовал бы прочтение документов, доступных в сборка "мусора" Java HotSpot для больше подробно деталей о сборке "мусора".
FindBin::libs is excellent for that. I've used it for a while in a large system with no problems at all.
The default invocation looks like it'll work for you, simply:
use FindBin::libs;
This will search for all the ./lib
dirs in all the parent directories of the current file's dir and use lib
them. So, for example, if your script lives in /home/w/myapp_live/scripts/defurblise_widgets.pl
(and use()
es FindBin::libs), it will look for:
/home/w/myapp_live/scripts/lib
/home/w/myapp_live/lib
/home/w/lib
/home/lib
/lib # (presumably!)
Any that it finds with be added to you @INC
with use lib
.
But, if that's not quite what you need, it's a very flexible module. I'd be surprised if you can't find a way to make it do what you want.
Если вы запускаете программу из командной строки, не устанавливайте библиотеку программно: просто передайте ее в качестве аргумента, например: perl -I / location / of / my / lib myprog.pl
.
Почему бы вам не сделать вашу библиотеку для вашего веб-приложения относительно местоположения самого скрипта? Затем просто установите его на каждую машину, где находятся библиотеки.
use FindBin;
use File::Spec::Functions;
use Cwd qw(abs_path getcwd);
BEGIN {
my $curdir = getcwd;
my $selfdir = $FindBin::Bin;
my $libdir = abs_path(catdir($selfdir, 'lib'));
chdir $libdir or die "can't chdir to $libdir: $@";
use lib $libdir;
}
Конечно, самый простой вариант - не использовать разные каталоги библиотек. Почему вы не можете быть последовательными во всех ваших средах?
Редактировать. Повторите свой комментарий «Причина, по которой я должен использовать разные каталоги lib, заключается в том, что код, работающий на действующем сайте, отличается от кода, работающего на бета-сайте ... в этом смысл наличия бета-сайта». - почему бы вам не справиться с этим на уровне установщика, вместо того, чтобы заставлять сам код знать, жив ли он или бета? например, храните код в разных каталогах в дереве исходных текстов, как сейчас, но устанавливайте только соответствующий код в каждое поле. В конце концов, это именно то, что сделала бы для вас хорошая система контроля версий - вы проверяете только одну ветку за раз, и вы должны устанавливать только одну версию кода за раз (как намекал Брайан д Фой).
Я использую следующее во многих своих сценариях:
use strict;
use warnings;
use 5.008;
use FindBin;
use lib $FindBin::Bin;
Эту последнюю строку можно изменить как таковую:
use FindBin;
use lib "$FindBin::Bin/lib";
В разных средах могут быть разные настройки для переменной среды $ PERL5LIB
.
Показанный вами код выглядит разумным. Вы можете установить одну копию этого кода в общесистемном месте, и тогда код для его вызова будет иметь вид
require '/path/to/findlib.pl';
findlib->import;
. Форма требует
, которая принимает имя файла , не search @INC
.
В качестве альтернативы, если вы хотите изменить множество вещей, вы можете изучить развертывание приложения таким образом, чтобы было удобнее для local :: lib использование.