build.xml包含<scp>和<sshexec>任务,所以我在build.xml中提供了jsch.jar和其他库在同一目录中.
以下taskdef:
<taskdef name="scp"
classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
classpath="WebContent/WEB-INF/lib/jsch-0.1.43.jar" />
Run Code Online (Sandbox Code Playgroud)
抛出错误
A class needed by class org.apache.tools.ant.taskdefs.optional.ssh.Scp
cannot be found: com/jcraft/jsch/UserInfo
Run Code Online (Sandbox Code Playgroud)
我无法修改标准的Ant安装(例如将jsch.jar放在ant lib目录中,或删除ant-jsch.jar),或添加命令行标志,或修改系统环境变量等:脚本必须默认运行Ant在不同的系统上.
我实际上是在重新提出这里最初提出的问题:http: //ant.1045680.n5.nabble.com/specifying-location-of-an-external-library-within-build-xml-td1344969.html
但是无法得到关于classloader工作的答案.
给定一个可以工作的远程JNLP(所有jar都可用等),但是你需要在代码上运行一个调试会话.
是否有任何工具可以轻松地在任何合理的现代IDE中创建本地项目,该IDE包含JNLP中所述资源的本地副本,并且可以在调试模式下运行所述代码?假设反编译器可用,这只是让调试会话运行的问题.
是否有任何IDE(Eclipse,Netbeans,IntelliJ,JDeveloper等等 - 甚至是商业产品)只能在给定JNLP URL的情况下执行此操作?
当我尝试通过jdbc连接mysql时,我遇到了异常.这个问题类型已经被问到但是我没有得到解决我问题的方法,这是我的代码......
public static void main(String[] args) {
String url="jdbc:mysql://localhost:3306/student?
autoReconnect=true&useSSL=false";
String user="root";
String pass="system";
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Now connecting to databse...\n");
Connection con=DriverManager.getConnection(url,user,pass);
System.out.println("Connected !!!\n");
con.close();
System.out.println("connection close !!!\n");
} catch (ClassNotFoundException | SQLException e) {System.out.println(e);
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
}
这些是我得到的例外......
run:
Now connecting to databse...
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at …Run Code Online (Sandbox Code Playgroud) 我想动态加载JAR,直接加载内存.
说,我有一个包含JAR的缓冲区,我想加载JAR中的所有类,或者至少列出JAR中存在的所有文件.(课程,图像等......).
如果我加载的第一个类依赖于第二个类,我该怎么办?java知道如何处理这个吗?或者我自己照顾这个?
有没有办法在运行时更新系统类加载器?在我动态加载jar文件之后,有什么办法可以将从这个jar加载的类/包添加到我的系统类加载器中吗?
我试图这样做的原因是,虽然我通过在我自己的代码中传递我新创建的ClassLoader取得了一些成功,但我遇到了第三方库(apache-WSIF)的问题似乎正在使用传递的ClassLoader.
我试图在运行时将jar文件添加到classpath.我用这个代码
public static void addURL(URL u) throws IOException {
URLClassLoader sysloader = (URLClassLoader) ClassLoader
.getSystemClassLoader();
Class<URLClassLoader> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
System.out.println(u);
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error");
}
}
Run Code Online (Sandbox Code Playgroud)
系统输出打印此网址:
file:/B:/Java/Tools/mysql-connector-java-5.1.18/mysql-connector-java-5.1.18/mysql-connector-java-5.1.18-bin.jar
Run Code Online (Sandbox Code Playgroud)
我仔细检查了这条路,这个罐子存在.即使这个测试显示com.mysql.jdbc.驱动程序类存在.
javap -classpath "B:\Java\Tools\mysql-connector-java-5.1.18\
mysql-connector-java-5.1.18\mysql-connector-java-5.1.18-bin.jar" com.mysql.jdbc.
Driver
Compiled from "Driver.java"
public class com.mysql.jdbc.Driver extends com.mysql.jdbc.NonRegisteringDriver i
mplements java.sql.Driver{
public com.mysql.jdbc.Driver() throws java.sql.SQLException;
static {};
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用这个Class.forName(驱动程序)时,我仍然得到java.lang.ClassNotFoundException.这段代码有什么问题?
是否可以从jar文件加载一个类,然后从中创建一个对象?
注意:程序编译时,jar文件不存在,但稍后由用户添加,并在用户启动程序时加载.
我的代码喜欢这样:用户有一个jar文件,其中只有一个编译过的java类.然后,用户将此jar文件放在一个目录中,并启动我的程序,该程序查看目录并找到此jar文件.然后它加载这个jar文件并从中创建一个类,然后由它创建一个对象并将其添加到数组中.
除了从jar文件创建一个类(作为java.io文件加载)然后从该类创建和对象之外,我已经完成了所有工作.
有帮助吗?谢谢.
我当前的java项目正在使用来自另一个项目(同一个包)的方法和变量.现在,另一个项目的jar必须在类路径中才能正常工作.我的问题是jar的名称可以并且会因为版本的增加而改变,并且因为你不能在manifest类路径中使用通配符,所以不可能将它添加到类路径中.所以目前启动我的应用程序的唯一选择是使用-cp命令行中的参数,手动添加我的项目依赖的另一个jar.
为了改善这一点,我想动态加载jar并阅读有关使用ClassLoader的信息.我为它阅读了很多例子,但是我仍然不明白如何在我的案例中使用它.
我想要的是加载一个jar文件,比方说,myDependency-2.4.1-SNAPSHOT.jar但它应该能够只搜索一个jar文件,myDependency-因为我已经说过版本号可以随时改变.然后我应该能够像我现在一样在我的代码中使用它的方法和变量(比如ClassInMyDependency.exampleMethod()).
任何人都可以帮助我,因为我已经在网上搜索了几个小时,但仍然没有得到如何使用ClassLoader来做我刚才解释的.
提前谢谢了
我之前已经看过这里,了解如何将 jar 动态加载到类路径中。当时提出的这个解决方案完美无缺:
File file = ...
URL url = file.toURI().toURL();
URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, URL);
Run Code Online (Sandbox Code Playgroud)
然而,这在 Java 9+ 中是不可能的,但有一个涉及Module#addOpens的 hack ,它允许打开 URL 方法。例如,打开模块的代码如下所示:
try {
final Class<?> moduleClass = Class.forName("java.lang.Module");
final Method getModuleMethod = Class.class.getMethod("getModule");
final Method addOpensMethod = moduleClass.getMethod("addOpens", String.class, moduleClass);
final Object urlClassLoaderModule = getModuleMethod.invoke(URLClassLoader.class);
final Object thisModule = getModuleMethod.invoke(DependencyUtilities.class);
addOpensMethod.invoke(
urlClassLoaderModule, URLClassLoader.class.getPackage().getName(), thisModule);
Logger.info(
"User is using Java 9+, meaning Reflection Module does have to …Run Code Online (Sandbox Code Playgroud) 内args[]的public static void main(String args[]),我想指定要执行哪个子类.如何将args[](a String)的参数转换为类声明?
例如,如果args[0]= "Subclass1",那么我需要声明:
BaseClass b = new Subclass1()
这可能与Java有关吗?
编辑
为了使这一步更加棘手,这些子类来自外部.jar.有没有办法动态导入子类,还是需要事先导入它们?