ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Java autoreq/autoprov draft
@ 2007-02-06 22:21 Damir Shayhutdinov
  2007-02-07  5:37 ` Ildar Mulyukov
  2007-02-15  9:24 ` Alexey Tourbin
  0 siblings, 2 replies; 27+ messages in thread
From: Damir Shayhutdinov @ 2007-02-06 22:21 UTC (permalink / raw)
  To: Igor Vlasenko; +Cc: ALT Devel discussion list

> А разве нельзя залезать в .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)

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

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

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2007-02-22 16:19 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-06 22:21 [devel] Java autoreq/autoprov draft Damir Shayhutdinov
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

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