Как удалить старые версии плагинов Eclipse? - PullRequest
28 голосов
/ 21 октября 2008

После обновления старые плагины Eclipse остаются в папке «plugins» (в папке «functions» также есть остатки).

Есть ли способ удалить их автоматически?

Ответы [ 9 ]

9 голосов
/ 08 апреля 2011

Чтобы избавиться от старых плагинов, вы должны очистить историю установки. Перейти к справке | О затмении | Детали установки | История установки и выберите все старые вещи. Затем нажмите «Удалить» и перезапустите. Вуаля. Это работает с Eclipse Helios (3.6)

5 голосов
/ 04 марта 2014

Удаление старых плагинов - это всегда хлопотно. Особенно когда вы обновляетесь, и ваш Eclipse просто не хочет запускаться снова, и вам нужно выяснить это через ад метаданных зависимостей плагинов.

Я видел, как некоторые из вас пытались исправить это с помощью сценария.

Eclipse Plugin Cleaner

Ну, я создал инструмент на основе Java ( с тестами, собранный maven и размещенный на github, так что вы можете свободно его разветвлять ), который проверяет дубликаты плагинов анализировать файлы манифеста (или имена файлов, если манифест неполный или поврежден).

Теперь

Вы можете довольно легко, например, загрузить последнюю версию Eclipse и поместить старый Eclipse в папку dropins/eclipse, и инструмент очистит папку dropins - таким образом, ваши новые пакеты будут сохранены, а старый удален (папка dropins). предпочтительнее для удаления, если найдены 2 или более одинаковых версий).

Дополнительную информацию о Eclipse Plugin Cleaner можно найти по адресу https://github.com/azachar/eclipse-plugin-cleaner

5 голосов
/ 04 июня 2012

Я также хочу удалить старые плагины, но до сих пор не нашел ответа, поэтому я написал быстрый и грязный скрипт guess-old-eclipse-plugins.sh для обработки старых плагинов.

Этот скрипт будет сканировать каталог плагинов в каталоге Eclipse. и сгенерирует файл remove-old-eclipse-plugins.txt, который можно использовать для удаления старых плагинов.

Этот скрипт протестирован под Cygwin 1.7.15 в Windows XP.

guess-old-eclipse-plugins.sh

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 для удаления плагинов, убедитесь, что все перечисленные в нем плагины REALLY старые плагины. Потому что этот скрипт не может обрабатывать имя файла содержит более 1 _ символов. Например: подключаемые модули JUnit v3 и v4 представляют собой 2 различных подключаемых модуля , но сценарий будет обрабатывать их как одинаковые подключаемые модули, поскольку эти 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 IDE может работать неправильно.

Пример вывода

$ ./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
4 голосов
/ 20 ноября 2015

Вместо сортировки и т. Д. Решения должны основываться на содержании bundles.info.

Ручное решение:

  • создать копию eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info
  • 1010 * редактировать *
  • поиск регулярного выражения: .*plugins/([^,]*),.*, замените на: $1 (например, используя Блокнот ++ )
  • перейти к eclipse/plugin/
  • выбор файлов и папок, перечисленных в этом новом файле (например, в Total Commander : Отметить> Загрузить выборку из файла )
  • инвертированный выбор
  • удалить / переместить выбранные файлы и папки
4 голосов
/ 16 июля 2013

Я изменил скрипт, чтобы разрешить все дропины, функции и плагины. Сначала он использует обратную сортировку, чтобы угадать самую последнюю версию канонического плагина.

Затем он сокращает это квалифицированное имя версии плагина до канонического выражения sed плагина. Если плагин является первым соответствием для этого выражения, он сохраняет свой шаблон и сохраняет его, в противном случае это старая устаревшая версия, и он помечает ее для удаления.

</p> <pre> # 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 </pre> <p>

2 голосов
/ 21 октября 2008

С Ganymede (3.4) правильным способом управления вашими плагинами будет удаление их в папку ' dropins ':

\[eclipse\]/dropins/eclemma1.3.1/eclipse/(plugins|features)

Этот плагин будет обнаружен механизмом инициализации 'p2' и использован, но не скопирован в плагины и содержит каталоги eclipse . Он остается в папке dropins.

Когда вы удалите eclemma1.3.2, все, что вам нужно сделать, это удалить eclemma1.3.1 из вашего каталога dropins, и эта старая версия исчезнет.

1 голос
/ 30 сентября 2018

Я использую следующую команду:

eclipse -application org.eclipse.equinox.p2.garbagecollector.application -profile epp.package.jee

Примечания:

  1. Это задокументировано в Equinox / p2 / FAQ , см. «Почему пакеты не удаляются, когда была удалена связанная с ними функция?»

    Ответы на часто задаваемые вопросы ссылаются на ветку форума сообщества Eclipse"Флажок плагина остается после удаления функции" (июнь 2010 г.) в качестве источника этого рецепта.

    Рецепт все еще действует в настоящее время, с Eclipse 4.8 Photon.

  2. Аргумент -profile зависит от того, какую упаковку Eclipse IDE вы используете. Приведенный выше (epp.package.jee) предназначен для «Eclipse для разработчиков Java EE». Я нашел это в файле configuration/config.ini. В соответствующей строке есть следующее:

    eclipse.p2.profile=epp.package.jee
    
1 голос
/ 21 мая 2015

Я создал скрипт на python для перемещения старых плагинов в резервную папку, поэтому, если что-то пойдет не так, он может вернуться назад. Сценарий имеет два режима работы: ручной режим спрашивает вас, что делать с каждым обнаруженным дублированным плагином, и автоматический вопрос только в тех случаях, когда длина строки изменилась и, следовательно, могла изменить систему или нумерацию версий.

Надеюсь, это кому-нибудь поможет

# -*- 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()
1 голос
/ 21 октября 2008

Eclipse позволяет вам вернуться к любой предыдущей конфигурации (перейдите в меню «Справка», затем «Обновления программного обеспечения»). Я предполагаю, что Eclipse не удалит эти старые версии, или эта функциональность больше не будет работать.

Если при перезапуске Eclipse вы предоставляете аргумент «-clean», он выполняет различные операции очистки, но по причинам, указанным выше, я не думаю, что он удалит старые плагины / функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...