From: "Damir Shayhutdinov" <damir@altlinux.org>
To: "Igor Vlasenko" <vlasenko@imath.kiev.ua>
Cc: ALT Devel discussion list <devel@lists.altlinux.org>
Subject: [devel] Java autoreq/autoprov draft
Date: Wed, 7 Feb 2007 01:21:37 +0300
Message-ID: <679044850702061421q6ae68ee1j6f263daae18620e2@mail.gmail.com> (raw)
> А разве нельзя залезать в .jar, разбирать .class файлы и находить все
> объекты, которые в них используются? Так получится Requires.
> А Provides вообще получаются анализом содержимого .jar файла.
>
> Примеры зависимости: Java(org.apache.xpath.XPath)
> Правда получится довольно много этих самых Provides и Requires :( Зато
> автоматом.
Появилась идея получше. Так как минимальной файловой единицей в Java
является .jar-файл, то Provides/Requires можно в принципе
организовывать на них.
Вот например в пакете jakarta-oro
rpm -ql jakarta-oro | fgrep .jar
/usr/share/java/jakarta-oro.jar
находится один .jar файл.
Поэтому можно присвоить пакету jakarta-oro следующие auto provides:
Java(jakarta-oro)
Это выглядит довольно легко.
Теперь сложная часть - поиск Requires.
Для этого надо сначала пройтись по всем .jar файлам в /usr/share/java
и составить списки всех .class файлов находящихся в них.
for i in /usr/share/java/*.jar; do jar -tf $i | fgrep .class | cut -f
1 -d . > `basename $i .jar`; done
Получится список классов, которые содержатся в .jar-файле.
Теперь надо найти какие же из .jar-файлов, установленных в
/usr/share/java реально используются пакетом (auto requires).
Для проверки я взял пакет jakarta-oro-demo.
В нем скомпилированные классы находятся в незапакованном виде.
ls -1 /usr/share/java
ant
bcel.jar
excalibur-logkit.jar
geronimo-specs
jakarta-commons-collections.jar
jakarta-oro.jar
jakarta-regexp.jar
jakarta-servletapi4.jar
jaxp_parser_impl.jar
jaxp_transform_impl.jar
jdom.jar
jspapi5.jar
log4j.jar
serializer.jar
servletapi5.jar
servletapi.jar
velocity.jar
werken-xpath.jar
xalan-j.jar
xerces-j.jar
xml-commons-apis.jar
xml-commons-external.jar
После выполнения предыдущего скрипта у меня в текущей директории
получились вот такие вот файлы списков классов в каждом .jar
ls -1 .
bcel
excalibur-logkit
jakarta-commons-collections
jakarta-oro
jakarta-regexp
jakarta-servletapi4
jaxp_parser_impl
jaxp_transform_impl
jdom
jspapi5
log4j
serializer
servletapi
servletapi5
velocity
werken-xpath
xalan-j
xerces-j
xml-commons-apis
xml-commons-external
Я создал вот такой вот маленький скрипт-обертку для поиска requires:
cat ~/bin/find-java-requires
#!/bin/sh
JARLISTDIR=~/tmp/java #FIXME директория где лежат списки
for jarlist in $JARLISTDIR/*
do
fgrep -qf "$jarlist" -- "$@" && echo "Java(`basename $jarlist`)"
done
Натравив его на .classes файлы из jakarta-oro-demo командой
find /usr/share/doc/jakarta-oro-2.0.8/ -name '*.class' -print0 | xargs
-r0 find-java-requires
я получил вывод
Java(jakarta-oro)
Вот какие автозависимости можно поставить пакету jakarta-oro-demo.
Теперь про пакеты с .jar файлами.
Возьмем например пакет velocity.
rpm -ql velocity | fgrep .jar
/usr/share/java/velocity.jar
Идея такая - распаковываем этот .jar файл в какую-нибудь временную
директорию, получаем список .class файлов и натравливаем на них
find-java-requires.
cat ~/bin/find-java-jar-requires
#!/bin/sh
OURDIR=`mktemp -dt`
cd "$OURDIR" && jar -xf "$1"
find "$OURDIR" -name '*.class' -print0 | xargs -r0 find-java-requires
rm -rf -- "$OURDIR"
Теперь смотрим результаты:
find-java-jar-requires /usr/share/java/velocity.jar
Java(excalibur-logkit)
Java(jakarta-commons-collections)
Java(jakarta-oro)
Java(jakarta-servletapi4)
Java(jdom)
Java(log4j)
Java(servletapi)
Java(servletapi5)
Java(velocity)
Java(werken-xpath)
Java(xml-commons-apis)
Java(xml-commons-external)
Вуаля!
Можно посмотреть еще остальные .jar файлы - например
find-java-jar-requires /usr/share/java/log4j.jar
Java(log4j)
Java(xml-commons-apis)
Java(xml-commons-external)
find-java-jar-requires /usr/share/java/bcel.jar
Java(bcel)
Java(jakarta-regexp)
find-java-jar-requires /usr/share/java/jakarta-servletapi4.jar
Java(jakarta-servletapi4)
Java(jspapi5)
Java(servletapi)
Java(servletapi5)
На первый взгляд все работает :)
Жду критики, комментариев и предложений по улучшению.
next reply other threads:[~2007-02-06 22:21 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-06 22:21 Damir Shayhutdinov [this message]
2007-02-07 5:37 ` Ildar Mulyukov
2007-02-07 8:23 ` Damir Shayhutdinov
2007-02-07 12:56 ` Ildar Mulyukov
2007-02-07 16:47 ` Igor Vlasenko
2007-02-08 9:51 ` Igor Vlasenko
2007-02-08 10:13 ` Damir Shayhutdinov
2007-02-08 10:36 ` Igor Vlasenko
2007-02-08 12:17 ` Damir Shayhutdinov
2007-02-08 12:56 ` Igor Vlasenko
2007-02-15 10:27 ` Alexey Tourbin
2007-02-15 11:07 ` Alexey Tourbin
2007-02-15 14:36 ` Igor Vlasenko
2007-02-15 14:45 ` Damir Shayhutdinov
2007-02-15 15:02 ` Igor Vlasenko
2007-02-15 17:36 ` Alexey Tourbin
2007-02-15 20:55 ` Igor Vlasenko
2007-02-19 5:31 ` Eugene Prokopiev
2007-02-22 16:19 ` [devel] ant Igor Vlasenko
2007-02-15 10:00 ` [devel] Java autoreq/autoprov draft Alexey Tourbin
2007-02-15 9:42 ` Alexey Tourbin
2007-02-15 18:15 ` Alexey Tourbin
2007-02-15 9:24 ` Alexey Tourbin
2007-02-15 9:34 ` Damir Shayhutdinov
2007-02-15 9:55 ` Alexey Tourbin
2007-02-15 10:18 ` Damir Shayhutdinov
2007-02-15 10:24 ` Alexey Tourbin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=679044850702061421q6ae68ee1j6f263daae18620e2@mail.gmail.com \
--to=damir@altlinux.org \
--cc=devel@lists.altlinux.org \
--cc=vlasenko@imath.kiev.ua \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git