是否可以不将JDBC添加到CLASSPATH?只需使用源代码。
我正在创建一个连接到数据库的程序,但我不希望我的用户要求他们将JDBC添加到类路径中,这对他们来说可能太难了。是不是可以不将JDBC添加到类路径中?
答案 0 :(得分:2)
不,不是。或者更准确地说,虽然可以在运行时以对用户相对不可见的方式将JDBC jar添加到运行时类路径,但是如果没有相关的驱动程序,则无法执行JDBC。
对于部署Java桌面应用程序,最好的选择通常是安装应用程序。使用Java Web Start。 JWS适用于Windows,OS X& * nix中。
这对您来说是更多的努力,但对最终用户来说是轻而易举的事。他们永远不需要知道关于运行时类路径的任何信息,也不需要了解它的内容。您还可以为他们提供方便的桌面快捷方式或菜单项来启动应用程序。
答案 1 :(得分:1)
理论上可以编写自己的JDBC驱动程序。如果您这样做,您的JDBC驱动程序将成为您的代码库的一部分,并且可能位于您的应用程序的JAR中。但这听起来像是一个非常糟糕的想法......
还可以创建一个“uber jar”,将您的代码和第三方代码组合到一个JAR文件中。但是有一个问题。某些开源许可证(例如LGPL)不允许您这样做。相反,他们可以要求许可证所涵盖的代码以一种形式提供,使最终用户 easy 将一个版本的库替换为另一个版本。 “超级罐”方法使这很困难。
但是,最好的方法是将应用程序打包为多个JAR,并安排安装程序将JAR放在正确的位置,并使用包装器脚本或自定义启动程序来确保CLASSPATH正确。
或者像@Andrew Thompson推荐的那样使用WebStart。这也有其他优点,例如提供一种简单的方法来处理更新,或检查用户的JRE安装是否是最新的。
答案 2 :(得分:1)
是的,这是可能的。
实际上并不是一个美丽的方法......
你使用一个名为lib的文件夹并把你的odbc jar放在那里,使用lib jar的相对路径,比如'lib / jodbc.jar'
您可以将jar嵌入到名为resource的文件夹中,之后每次启动应用程序时,都会查找文件夹lib / jodbc.jar,如果不存在,则可以创建文件夹并将资源文件复制到应用程序中到文件夹并完成。
我在某些应用程序中使用此方法并且到目前为止工作正常。我有同样的问题,用户添加类路径很困难,所以我只在我的应用程序中使用'portable'jre和libs。
很抱歉没有举例,但我现在在课堂上。
如果你需要更多例子,请告诉我,周一我可以回答。
氰
首先,您需要在项目中添加lib。
如果您使用的是NetBeans,请进入项目属性,在您的lib中添加jar,但首先将一个文件夹放在项目文件夹中,名为lib并使用.jar,然后添加jar并选择相对路径
复制资源:
//Create the /lib directory with the .jars and the service.exe
//The resource_path is the package where are your files...
String resource_path = "br/com/myservice/resources/";
Util.copyResource(this.getClass().getClassLoader(), resource_path, "PAF_Service.exe", currentDirectory);
resource_path = resource_path + "lib/";
String directory_lib = currentDirectory + "lib/";
File dir_lib = new File(directory_lib);
if(!dir_lib.exists()){
dir_lib.mkdir();
}
Util.copyResource(this.getClass().getClassLoader(), resource_path, "ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar", directory_lib);
Util.copyResource(this.getClass().getClassLoader(), resource_path, "log4j-1.2.17.jar", directory_lib);
Util.copyResource(this.getClass().getClassLoader(), resource_path, "WinRun4J.jar", directory_lib);
copyResource方法:
public static boolean copyResource(ClassLoader classLoader, String resource_path, String resource, String destiny){
FileOutputStream fos = null;
Boolean retorno = false;
try {
InputStream is = classLoader.getResourceAsStream(resource_path + resource);
if(is == null){
System.out.println("Resource not found! >> " + resource_path + resource);
retorno = false;
}
fos = new FileOutputStream( new File(destiny, resource));
byte[] buffer = new byte[1024];
int read = -1;
while( (read = is.read(buffer)) != -1 ) {
fos.write( buffer,0,read);
}
fos.flush();
fos.close();
retorno = true;
} catch (FileNotFoundException ex) {
Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if(fos != null)
fos.close();
} catch (IOException ex) {
Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
}
}
return retorno;
}