更新后,旧的 Eclipse 插件保留在“plugins”文件夹中(“features”文件夹中也有剩余)。
有没有办法自动删除这些?
要摆脱旧插件,您必须清除安装历史记录。转到帮助 | 关于日食 | 安装细节 | 安装历史并选择所有旧的东西。然后单击删除并重新启动。瞧。这适用于 Eclipse Helios (3.6)
我使用以下命令:
eclipse -application org.eclipse.equinox.p2.garbagecollector.application -profile epp.package.jee
笔记:
这记录在Equinox/p2/FAQ中,请参阅“为什么在删除相关功能后不删除捆绑包?”
常见问题解答引用了 Eclipse 社区论坛主题“功能卸载后插件 jar 仍然存在”(2010 年 6 月)作为本秘籍的来源。
该配方现在仍然有效,使用 Eclipse 4.8 Photon。
该-profile
参数取决于您使用的 Eclipse IDE 的包装。上面的 ( epp.package.jee
) 是针对“Eclipse for Java EE Developers”的。我在文件中找到它configuration/config.ini
。相关行如下:
eclipse.p2.profile=epp.package.jee
我也想删除旧插件,但今天仍然没有找到答案,所以我写了一个快速而肮脏的脚本guess-old-eclipse-plugins.sh
来处理旧插件。
该脚本将扫描 Eclipse 目录下的 plugins 目录。并将生成一个remove-old-eclipse-plugins.txt
可用于删除旧插件的文件。
此脚本在 Windows XP 上的 Cygwin 1.7.15 下测试。
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
文件删除插件之前,请确保其中列出的所有插件都是真正的旧插件。因为,此脚本无法处理包含超过 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
删除旧插件总是很麻烦。特别是当您升级并且您的 Eclipse 不想重新启动并且您需要通过插件依赖项的元数据地狱来解决它时。
我看到你们中的几个人试图通过脚本来解决这个问题。
好吧,我创建了一个基于 java 的工具(带有测试,由 maven 构建并托管在 github,所以你可以自由地分叉它),它通过内省清单文件(或文件名,如果清单不完整或损坏)检查插件的重复性.
例如,您可以很容易地下载最新的 Eclipse 并将旧的 Eclipse 放入dropins/eclipse
文件夹,该工具将清理 dropins 文件夹 - 因此您的新包被保留并删除旧包(dropins
如果 2 个或更多相同,则首选删除该文件夹找到版本)。
有关Eclipse 插件清洁器的更多信息,请访问https://github.com/azachar/eclipse-plugin-cleaner
而不是排序等,解决方案应该基于bundles.info
.
手动解决方案:
eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info
.*plugins/([^,]*),.*
,替换为:($1
例如使用Notepad++)eclipse/plugin/
我修改了脚本以允许所有插件、功能和插件。首先,它依靠反向排序来猜测最新的规范插件版本。
接下来,它将合格的插件版本名称简化为规范的插件 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 -application org.eclipse.equinox.p2.garbagecollector.application -profile SDKProfile
经过测试的 Eclipse v4.9。删除我的插件的旧版本。其他解决方案中提到的配置文件epp.package.jee
为我返回“不存在”。
使用 Ganymede (3.4),管理插件的正确方法是将它们放在“ dropins ”文件夹中:
\[eclipse\]/dropins/eclemma1.3.1/eclipse/(plugins|features)
该插件将被“p2”配置机制检测并使用,但不会复制到 eclipse 的插件和功能目录中。它保留在 dropins 文件夹中。
当您删除 eclemma1.3.2 时,您所要做的就是从您的 dropins 目录中删除 eclemma1.3.1,旧版本就消失了。
Eclipse 允许您恢复到任何以前的配置(转到“帮助”菜单,然后转到“软件更新”)。我的猜测是 Eclipse 不会删除这些旧版本,否则这个功能将不再起作用。
如果重新启动 Eclipse 时提供“-clean”参数,它会执行各种清理操作,但由于上述原因,我认为它不会删除旧插件/功能。
我在 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()
最简单、干净、高效的解决方案是简单地删除当前的 Eclipse 安装并安装最新的 Eclipse 版本(或重新安装当前版本)。
eclipse-java-2021-06-R-win32-x86_64.zip
eclipse
包含当前Eclipse安装的现有目录eclipse
目录下对于 STM32CubeIDE(一种流行的基于 Eclipse 的 STM32 微控制器系列的 IDE),此命令确实清理了 Windows 10 下的旧插件版本:
"C:\ST\STM32CubeIDE_1.3.0\STM32CubeIDE\eclipsec" -application org.eclipse.equinox.p2.garbagecollector.application -profile STM32CubeIDE