После обновления старые плагины Eclipse остаются в папке "plugins" (есть также остатки в папке "features" ).
Есть ли способ удалить их автоматически?
После обновления старые плагины Eclipse остаются в папке "plugins" (есть также остатки в папке "features" ).
Есть ли способ удалить их автоматически?
Чтобы избавиться от старых плагинов, вам нужно очистить историю установки. Перейти к справки | О Eclipse | Детали установки | История установки и выберите все старые вещи. Затем нажмите "Удалить" и перезапустите. Вуаля. Это работает с Eclipse Helios (3.6)
Я также хочу удалить старые плагины, но до сих пор не нашел ответа, поэтому я написал быстрый и грязный script guess-old-eclipse-plugins.sh
для обработки старых плагинов.
Этот script будет сканировать каталог плагинов в каталоге Eclipse. и будет генерировать файл remove-old-eclipse-plugins.txt
, который можно использовать для удаления старых плагинов.
Этот script протестирован под Cygwin 1.7.15 в Windows XP.
PluginsDir=plugins
FeaturesDir=features
PluginIDSeparator=_
RemovingScriptFileName=remove-old-eclipse-plugins.txt
rm -rf $RemovingScriptFileName
#for dir in $PluginsDir $FeaturesDir
for dir in $PluginsDir # $FeaturesDir: most file names in features dir contains more than 1 _ character
do
echo "Processing [$dir] directory..."
# split PluginID from filename
# (not reliable, but general working. (ex: will get one junit PluginID because there're move than 1 _ characters in file name))
file_list=$(ls $dir);
echo "$file_list" | cut -f1 -d $PluginIDSeparator > $dir-all.txt
echo "$file_list" | cut -f1 -d $PluginIDSeparator | uniq > $dir-uniq.txt
# get the PluginList which VERY POSSIBLY has old versions
diff_result=$(diff -U 0 $dir-uniq.txt $dir-all.txt)
plugins_which_has_old_versions=$(echo "$diff_result" | grep -e "^+[^+]" | cut -f 2 -d +)
#
for p in $(echo "$plugins_which_has_old_versions")
do
echo "$p"
i=0
for f in $(ls -d -t $dir/$p$PluginIDSeparator*) # use 'ls' command, can sort result by file time, but can not handle file name contains special characters (white space) when using wildcard
#for f in $(find $dir -name "$p$PluginIDSeparator*") # use 'find' command
do
if [ -d $f ]
then
# should use rm -rf
echo -n "[D]"
else
echo -n " "
fi
echo -n "$f"
((i++))
if [ $i -eq 1 ]
then
echo ""
continue # first file, the newest version
fi
echo " [old]"
echo "rm -rf $f" >> $RemovingScriptFileName
done
echo
done
done
Прежде чем использовать сгенерированный файл remove-old-eclipse-plugins.txt
для удаления плагинов, убедитесь, что все перечисленные в нем плагины - это ДЕЙСТВИТЕЛЬНО старые плагины. Поскольку этот script не может обрабатывать имя файла, содержит более 1 _
символов. Например: плагины JUnit v3 и v4 - это два разных плагина, но script будет рассматривать его как те же плагины, потому что эти 2 имени файла используют тот же префикс org.junit_
.
org.junit
[D]plugins/org.junit_3.8.2.v3_8_2_v20100427-1100
[D]plugins/org.junit_4.8.2.v4_8_2_v20110321-1705 [old] <-- wrong
Итак, используйте его ОЧЕНЬ ТЩАТЕЛЬНО, удалите неправильную часть перед ее использованием или ваша среда Eclipse может работать неправильно.
$ ./guess-old-eclipse-plugins.sh
Processing [plugins] directory...
org.eclipse.gef
plugins/org.eclipse.gef_3.7.2.v20111106-2020.jar
plugins/org.eclipse.gef_3.6.2.v20110110-2020.jar [old]
org.eclipse.help.base
plugins/org.eclipse.help.base_3.6.2.v201202080800.jar
plugins/org.eclipse.help.base_3.5.3.v201102101200.jar [old]
org.eclipse.help.ui
plugins/org.eclipse.help.ui_3.5.101.r37_20110819.jar
plugins/org.eclipse.help.ui_3.5.3.r36_20101116.jar [old]
...
rm -rf plugins/org.eclipse.gef_3.6.2.v20110110-2020.jar
rm -rf plugins/org.eclipse.help.base_3.5.3.v201102101200.jar
rm -rf plugins/org.eclipse.help.ui_3.5.3.r36_20101116.jar
rm -rf plugins/org.eclipse.help.webapp_3.5.3.r36_20101130.jar
rm -rf plugins/org.eclipse.jdt.apt.core_3.3.402.R36_v20110120-1000.jar
rm -rf plugins/org.eclipse.jdt.debug.ui_3.5.2.v20100928a_r362.jar
Удаление старых плагинов - это всегда хлопот. Особенно, когда вы обновляетесь, и ваш Eclipse просто не хочет начинать заново, и вам нужно выяснить его через зависимости метаданных от зависимостей плагинов.
Я видел, что вы пытались исправить это с помощью script.
Ну, я создал инструмент на основе Java (с тестами, созданный maven и размещенный в github, поэтому вы можете его разворачивать), который проверяет дубликаты плагинов путем интроспекции файлов манифеста (или имена файлов, если манифест неполный или поврежден).
вы можете с легкостью загрузить последнюю версию Eclipse и поместить старый Eclipse в папку dropins/eclipse
, и инструмент очистит папку dropins - таким образом ваши новые пакеты будут сохранены и старые удалены (папка dropins
предпочтительнее для удаления, если найдено 2 или более одинаковых версий).
Более подробную информацию о Eclipse Plugin Cleaner можно найти на https://github.com/azachar/eclipse-plugin-cleaner
Вместо сортировки и т.д. решения должны основываться на содержимом bundles.info
.
Решение вручную:
eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info
.*plugins/([^,]*),.*
, заменить на: $1
(например, с помощью Notepad ++)eclipse/plugin/
С помощью Ganymede (3.4) правильный способ управления вашими плагинами состоит в том, чтобы поместить их в папку dropins:
\[eclipse\]/dropins/eclemma1.3.1/eclipse/(plugins|features)
Этот плагин будет обнаружен механизмом инициализации "p2" и будет использоваться, но не скопирован в плагинах и каталогах функций eclipse. Он остается в папке dropins.
Когда вы отбросите eclemma1.3.2, вам нужно удалить eclemma1.3.1 из каталога dropins, и эта старая версия исчезла.
Я изменил script, чтобы разрешить все капли, функции и плагины. Сначала он полагается на обратную сортировку, чтобы угадать последнюю версию канонического плагина.
Затем он уменьшает это квалифицированное имя версии плагина до канонического выражения sed. Если плагин является первым совпадением для этого выражения, он сохраняет свой шаблон и сохраняет его, в противном случае это старая устаревшая версия, и она помещает его для удаления.
# scan_old_plugins.sh # script to scan for duplicate old eclipse features, plugins and dropins # generates a "clean-old-plugins.sh" script to clean old versions. # warning: DANGEROUS! review clean-old-plugins script before running it. DropinsDir=dropins FeaturesDir=features PluginsDir=plugins CanonicalPluginsFile=sed_canonical_plugins.sh CleanPluginScriptFile=clean_old_plugins.sh echo "" > $CanonicalPluginsFile echo "" > $CleanPluginScriptFile #for dir in $PluginsDir for dir in $FeaturesDir $PluginsDir $DropinsDir do echo "Processing [$dir] directory..." # file_list=$(\ls -1 $dir | sort -r); echo "$file_list" > $dir-all.txt # for p in $(echo "$file_list") do v=$(echo $p | sed -e 's/_[0-9\._\-]*/_.*/g' | sed -e 's/[0-9][0-9]*/.*/g') g=$(grep -l "$v" $CanonicalPluginsFile | head -1 | awk '{print $1}') if [ "$g" = "" ]; then echo "$p=keep"; echo "$v=$p" >> $CanonicalPluginsFile else echo "$p=stale"; echo "rm -rf $p" >> $CleanPluginScriptFile fi done done
Eclipse позволяет вернуться к любой предыдущей конфигурации (перейдите в меню "Справка", затем "Обновления программного обеспечения" ). Я предполагаю, что Eclipse не удалит эти старые версии, или эта функциональность больше не будет работать.
Если при перезапуске Eclipse вы предоставляете аргумент "-clean", он выполняет различные операции очистки, но по указанным выше причинам я не думаю, что он удалит старые плагины/функции.
Я создал script в python, чтобы переместить старые плагины в резервную папку, поэтому, если что-то пойдет не так, оно может вернуться. script имеет два режима работы: в ручном режиме запрашивается, что делать с каждым обнаруженным дублированным плагином, и автоматический вопрос только в тех случаях, когда длина строки изменилась и, следовательно, может измениться система или нумерация версий.
Я надеюсь, что это поможет кому-то
# -*- coding: utf-8 -*-
import os
import re
from datetime import datetime
directory="C:\\eclipse64\\plugins"
dirBackup="C:\\eclipse64\\PluginsBackup" #This folder is a kind of recycle bin for save deleted plugins. In case you have problems running eclipse after remove them you can restore them. If you don't detect any problem you can erase this folder to save disk space
manual=False #Verifying deletion of each plugin manually (True) or automatic (False)
def globRegEx(directory,pat,absolutePath=True,type_=0):
'''Function that given a directory and a regular pattern returns a list of files that meets the pattern
:param str directory: Base path where we search for files that meet the pattern
:param str pat: Regular expression that selected files must match
:param bool absolutePath: Optional parameter that indicates if the returned list contains absolute (True) or relative paths (False)
:param int type_: Type of selection 0: selects files and directories 1: only selects files 2: only selects directories
:return: a list with the paths that meet the regular pattern
'''
names=os.listdir(directory)
pat=re.compile(pat)
res=[]
for name in names:
if pat.match(name):
path=directory+os.sep+name
if type_==1 and os.path.isfile(path):
res.append(path if absolutePath else name)
elif type_==2 and os.path.isdir(path):
res.append(path if absolutePath else name)
elif type_==0:
res.append(path if absolutePath else name)
return(res)
def processRepeated(repList):
''' this function is responsible for leaving only the newer version of the plugin
'''
if repList and len(repList)>1: #If the plugin is repeated
repList.sort(reverse=True)
print("Repeated plugins found:")
min=len(repList[0]) # If strings haven't got the same length indicates a change in the numeration version system
max=min
newer=datetime.fromtimestamp(0)
sel=0
for i,path in enumerate(repList):
lr=len(path)
modifDate=datetime.fromtimestamp((os.path.getctime(path)))
if modifDate>newer: #Keep the last creation date and its index
newer=modifDate
sel=i+1
if lr<min:
min=lr
elif lr>max:
max=lr
print(str(i+1) + " " + modifDate.strftime("%Y-%m-%d") + ": " + path)
print(" ")
if manual or min!=max: #If manual mode is enabled or if there is a string length diference between different version of plugins
selec=raw_input("Which version do you want to keep?: ["+str(sel)+"] ")
if selec:
selec=int(selec)
else:
selec=sel #Newer is the Default value
else:
selec=1
del(repList[selec-1]) #Delete selected plugin from the list
for path in repList: #Move the rest of the list to the backup folder
print("Deleting: "+ path)
os.renames(path,os.path.join(dirBackup,os.path.basename(path)))
print("-------------------------------------\n\n")
def main():
filePlugins=globRegEx(directory,"^.*$",False,1) #Creates a list with all the files only
dirPlugins=globRegEx(directory,"^.*$",False,2) #Creates a list with all the folders only
#Process files first
for plugin in filePlugins:
m=re.match(r"(.*_)\d.*?\.jar$",plugin) #Creates the glob pattern
if m:
patAux=m.groups()[0]+".*?\.jar$"
find=globRegEx(directory,patAux,True,1)
processRepeated(find)
#Now Directories
for plugin in dirPlugins:
m=re.match(r"(.*_)\d.*$",plugin) #Creates the glob pattern
if m:
patAux=m.groups()[0]+".*$"
find=globRegEx(directory,patAux,True,2)
processRepeated(find)
if __name__=="__main__":
main()