happmaoo 发表于 2013-1-15 02:11:58

Subduing CLASSPATH

<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe><div class="postText">原文地址:http://www.artima.com/weblogs/viewpost.jsp?thread=172953

第一, 将文件放到jre\lib\ext目录中有什么不好呢?最近我听说可能有某种安全问题, 所以禁止那样做。可能在某些情况下的确是那样子。我可不想知道所有的那些情况。

此外, 在配置CLASSPATH的时候, 你不得不点击一堆目录去找到jre\lib\ext, 并且至少在我的系统上看起来有两个地方存在这个目录, 一个是JDK, 另一个是JRE。一半儿的时候我都把文件放错的位置。太令人恼火了。

如果将所有的jar文件都放到一个文件夹下, 比如说是c:\jar, 会怎么样呢?我不认为那有什么不好, 而且看起来那样做更易于管理。而且如果你想要将你设置从台式机移到你的笔记本上, 你所要做的工作就是拷贝那个文件夹就够了。

另外的问题就是每次你要向CLASSPATH中添加一个新的jar文件或者新的目的话, 你不得不去在一个很小的窗口下修改环境变量, 如果不可以那么做的话, 我会很高兴的。而且在你的CLASSPATH中很容易存在一些错误的, 或者不存在的文件或目录, 我也希望那些错误可以被自动的修正。

在这里我向你们推荐Python这个工具。对于处理文件或者目录的工作来说, 使用Python是非常便利的。更令人兴奋的是, 在Python中有一个_winreg模块, 它是Python分发版本中的一个标志模块, 可以帮助你直接去修改注册表。

下面的程序可以从你的注册表中提取CLASSPATH的设置,所以即使CLASSPATH被一个命令窗口临时修改了也是没有关系的,然后踢出掉无效和重复的地址, 然后再做下面三个之中的一个工作:
如果当前目录下面有一些jar文件,而你又没有提供一些命令行参数, 所有的这些jar文件就被添加到你的CLASSPATH中去了。
如果在当前目录下面没有jar文件, 这个文件夹就被添加到你的CLASSPATH中去了。
如果你提供了一些命令行参数, 那些参数就被当作是jar文件而添加到你的CLASSPATH中去了。

所有如果你在你的c:\jar目录中执行改程序的话, 每次你想要添加一个新的jar到你的CLASSPATH中去, 你所要做的工作就是双击这个程序就够了。

最后, 我想说的是这对于初学者应该是一个比较理想的解决方案, 不必将大量的时间浪费在处理CLASSPATH这个问题上。

下面的程序google帮了我不少忙, 而且这里有一片文章也是很有用的。
<div style="">http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif#!python
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"""
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifSetClasspath.pybyBruceEckel,2006www.MindView.net
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifPermissiongrantedforfreeuseanddistributionaslongasthisnoticeismaintained.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifWarning!ThisprogrammodifiestheWindowsRegistry!Useatyourownrisk.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifWithnoarguments:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifIftherearejarfilesinthecurrentdirectory,eachoneisaddedtotheCLASSPATH.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifIftherearenojarfiles,thecurrentdirectoryisaddedtotheCLASSPATH.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifWitharguments:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifEachargumentmustbeajarfilename.EachargumentisaddedtotheCLASSPATH.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifDuplicateCLASSPATHentriesandnonexistentpathsareremoved.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifIrecommendcreatingC:jarsdirectory,andaddingthisprogramtothatdirectory.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifWheneveryouneedtoaddanewjar,throwitinC:jarsanddouble-clickthisprogram.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifThatway,ifyouneedthesamesetofjarsonanothermachine,justcopythe
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifdirectoryandrunthisprogram.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifIt'salsousefultocreateabatch/cmdfiletorunthisprogram,andtoplace
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifthatfileinyourWindowsPATH.Thenyoucanruntheprogramfromanydirectory.
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifThebatchfilemightlooklikethis:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpythonC:jarsSetClassPath.py%1%2%3%4%5%6%7%8%9
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifIfyou'rerunningCygwin,youcanmakeashellfiletodothesamething:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpythonC:/jars/SetClassPath.py$1$2$3$4$5$6$7$8$9
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifThisprogramrequiresPythonWin,whichyoucanfindat:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifhttp://starship.python.net/crew/mhammond/win32/
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"""
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giffrom_winregimport*
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifimportos,glob,sys
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifimportwin32gui,win32con#FromPythonWin
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpath=r'SYSTEMCurrentControlSetControlSessionManagerEnvironment'
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifdefgetClassPath():
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giftry:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifreg=ConnectRegistry(None,HKEY_LOCAL_MACHINE)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifkey=OpenKey(reg,path,0,KEY_ALL_ACCESS)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifi=0
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifwhileTrue:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giftry:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifname,value,valueType=EnumValue(key,i)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gififname=='CLASSPATH':
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifreturnvalue
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifi+=1
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifexceptEnvironmentError:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifreturn""
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giffinally:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifCloseKey(key)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifCloseKey(reg)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifdefsetClassPath(newPath):
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giftry:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifreg=ConnectRegistry(None,HKEY_LOCAL_MACHINE)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifkey=OpenKey(reg,path,0,KEY_ALL_ACCESS)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifSetValueEx(key,'CLASSPATH',0,REG_SZ,newPath)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifwin32gui.SendMessage(win32con.HWND_BROADCAST,win32con.WM_SETTINGCHANGE,0,'Environment')
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giffinally:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifCloseKey(key)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifCloseKey(reg)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifif__name__=='__main__':
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif#setpreventsduplicates,'ifos.path.exists(p)'prunesnonexistentpaths:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts=set(forpingetClassPath().split(os.pathsep)ifos.path.exists(p)])
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts.add(".")
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts.add("..")
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gififlen(sys.argv)>1:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifforarginsys.argv[1:]:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gififnotarg.endswith(".jar"):
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifprint"Argumentsmustbejarfilenames:problemwith["+arg+"]"
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifsys.exit(1)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gififnotos.path.exists(arg):
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifprintarg,"doesnotexistinthisdirectory"
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifsys.exit(1)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts.add(os.path.abspath(arg))
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifelse:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifjars=glob.glob("*.jar")
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gififjars:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifforjarinjars:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts.add(os.path.abspath(jar))
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifelse:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifpathparts.add(os.getcwd())
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifresult=list(pathparts)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifresult.sort()
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifnewClasspath=os.pathsep.join(result)+os.pathsep
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifsetClassPath(newClasspath)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifprintgetClassPath()
页: [1]
查看完整版本: Subduing CLASSPATH