ALT Linux Team development discussions
 help / color / mirror / Atom feed
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)

На первый взгляд все работает :)

Жду критики, комментариев и предложений по улучшению.

             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