How to remove old versions of Eclipse plugins?
更新后,旧的Eclipse插件仍保留在"plugins"文件夹中("features"文件夹中也有剩余部分)。
有没有办法自动删除它们?
要删除旧插件,您必须清除安装历史记录。转到帮助|关于Eclipse |安装细节|安装历史记录并选择所有旧的东西。然后单击删除并重新启动。瞧。这适用于Eclipse Helios(3.6)
删除旧插件总是很麻烦。特别是当您升级并且您的Eclipse不想再次启动时,您需要通过插件依赖项的元数据来解决它。
我已经看到你们中的一些人试图通过脚本解决这个问题。
Eclipse插件清理器
好吧,我已经创建了一个基于java的工具(带有测试,由maven构建,并在github上托管,因此你可以自由分叉)通过内省清单文件(如果清单不完整或已损坏,则检查文件名)来检查插件的重复性)。
现在
您可以非常轻松地下载最新的Eclipse并将旧的Eclipse放入
有关Eclipse插件清理程序的更多信息,请访问https://github.com/azachar/eclipse-plugin-cleaner
我也想删除旧的插件,但今天仍然没有找到答案,所以我写了一个快速而脏的脚本
该脚本将扫描Eclipse目录下的plugins目录。并将生成一个
此脚本在Windows XP上的Cygwin 1.7.15下进行了测试。
guess-old-eclipse-plugins.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 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 |
重要的提醒
在使用生成的
1 2 3 | 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可能无法正常工作。
样本输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ ./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] ... |
示例生成的脚本
1 2 3 4 5 6 | 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/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info 的副本 - 编辑
-
搜索正则表达式:
.*plugins/([^,]*),.* ,替换为:$1 (例如,使用Notepad ++) -
转到
eclipse/plugin/ - 选择此新文件中列出的文件和文件夹(例如,在Total Commander中:标记>从文件加载选择)
- 反转选择
- 删除/移动选定的文件和文件夹
我已经修改了脚本以允许所有dropins,功能和插件。
首先,它依赖于反向排序来猜测最新的规范插件版本。
接下来,它将该合格的插件版本名称减少为规范插件sed表达式。
如果插件是此表达式的第一个匹配项,则它存储其模式并保留它,否则它是一个旧的过时版本,并将其标记为删除。
使用Ganymede(3.4),管理插件的正确方法是将它们放在'dropins'文件夹中:
1 | \[eclipse\]/dropins/eclemma1.3.1/eclipse/(plugins|features) |
该插件将由'p2'配置机制检测并使用,但不会复制到eclipse的插件和功能目录中。它保留在dropins文件夹中。
当您删除eclemma1.3.2时,您所要做的就是从dropins目录中删除eclemma1.3.1,并且旧版本已经消失。
我使用以下命令:
1 | eclipse -application org.eclipse.equinox.p2.garbagecollector.application -profile epp.package.jee |
笔记:
这在Equinox / p2 / FAQ中有记录,请参阅"为什么在删除相关功能后不删除捆绑包?"
FAQ答案引用了Eclipse社区论坛主题"功能卸载后插件jar"(2010年6月)作为此配方的来源。
使用Eclipse 4.8 Photon,配方现在仍然有效。
1 | eclipse.p2.profile=epp.package.jee |
我在python中创建了一个脚本来将旧插件移动到备份文件夹,所以如果出现问题,它可以返回。
该脚本有两种操作模式:手动模式询问您如何处理检测到的每个重复插件,并且在字符串长度发生变化的情况下自动仅询问,因此可能更改了系统或版本编号。
我希望这可以帮助别人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | # -*- 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("------------------------------------- ") 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() |
Eclipse允许您恢复到以前的任何配置(转到"帮助"菜单,然后"软件更新")。我的猜测是Eclipse不会删除这些旧版本,否则此功能将不再起作用。
如果重新启动Eclipse时提供"-clean"参数,它会执行各种清理操作,但由于上述原因,我认为它不会删除旧的插件/功能。