为什么在Java中这么做呢?如果您想拥有任何类型的模块系统,您需要能够动态加载jar.我被告知有一种方法可以通过编写自己的方式来完成它ClassLoader,但这对于应该(至少在我看来)像调用一个以jar文件作为参数的方法一样容易的事情来做很多工作.
这样做的简单代码的任何建议?
我正在尝试通过Hibernate从MySQL数据库中检索数据,但我遇到了这个错误:
Failed to create sessionFactory object.org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded
java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
[...]
Run Code Online (Sandbox Code Playgroud)
我使用一个名为DAOFactory的类来获取hibernate会话:
public class DAOFactory {
private static boolean isInstance = false;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
private static Session session;
private DAOFactory() throws ExceptionInInitializerError{
if( !isInstance ) {
try {
Configuration cfg = new Configuration().configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
.buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object."+ ex); …Run Code Online (Sandbox Code Playgroud) 我试图动态地将类加载到组件中.我正在使用文件选择器来选择将要加载的.JAR文件,然后使用选项窗格来获取类的名称.
我已经在互联网上搜索如何将java文件转换为URL以便在URLClassLoader中加载它我已经提出:
File myFile = filechooser.getSelectedFile();
String className = JOptionPane.showInputDialog(
this, "Class Name:", "Class Name", JOptionPane.QUESTION_MESSAGE);
URL myUrl= null;
try {
myUrl = myFile.toURL();
} catch (MalformedURLException e) {
}
URLClassLoader loader = new URLClassLoader(myUrl);
loader.loadClass(className);
Run Code Online (Sandbox Code Playgroud)
我现在收到一个'无法找到符号'错误,将URL加载到URLClassLoader中
我正在研究类路径的动态修改.我找到了一个可以正常工作的解决方案,但它使用显式调用addURL()来实现.(大概是在启动时)
但是,如果默认的类加载器似乎无法找到它,我想在运行时拦截类加载过程以找到类.我试图将ClassLoader子类化,因此它只是委托findClass()和loadClass()默认,并打印出一个调试行告诉我这些方法已被调用,但是当我的类通过隐式类加载使用依赖类时,它们似乎永远不会被调用,例如
// regular object instantiation with 'new'
BrowserLauncher launcher;
launcher = new BrowserLauncher();
// static methods
Foobar.doSomethingOrOther();
// Class.forName()
Class cl = Class.forName("foo.bar.baz");
// reflection on a Class object obtained statically
Class<Foobar> cl = Foobar.class;
// do something with cl, like call static methods or newInstance()
Run Code Online (Sandbox Code Playgroud)
在这些情况下,类加载如何工作?(相对于显式调用Classloader.loadClass()的简单情况)
这是我在下面的自定义类加载器的尝试.如果我使用带有参数列表的DynClassLoader0.main(){"some.package.SomeClass", "foo", "bar", "baz"},并且some.package.SomeClass引用外部.jar文件中的其他类,使用上面列出的方法之一,为什么我的DynClassLoader0的findClass()和loadClass不是( )被叫?loadClass被调用的唯一时间是在下面的main()函数中对loadClass的显式调用.
package com.example.test.classloader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class DynClassLoader0 extends ClassLoader { …Run Code Online (Sandbox Code Playgroud) 我试图在运行时将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.这段代码有什么问题?
我知道我们可以使用自定义类加载器动态加载类.但在这里我的问题是我的课程本身取决于其他课程
我的任务是获取PigServer对象.所以我使用以下代码加载PigServer类
_pigServerClass = _classLoader.loadClass("org.apache.pig.PigServer");
Run Code Online (Sandbox Code Playgroud)
但是这里PigServer类本身依赖于很多其他类.
因此,当我试图获取PigServer类的实例时,它显示以下错误
java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
java.lang.ClassNotFoundException:org.apache.log4j.AppenderSkeleton
etc..
Run Code Online (Sandbox Code Playgroud)
有谁能说出如何解决这个问题?
假设我们想要require在Scala中构建一个类似于许多脚本语言的功能.
如果我们需要像这样的图书馆......
require("some-library.jar")
Run Code Online (Sandbox Code Playgroud)
...当执行require宏时,我们需要一种方法将此jar添加到编译器的类路径中.如何才能做到这一点?
我有一个java项目,它使用.properties文件进行配置.在服务器上,启动时,我将类路径设置为包含一个包含所有属性文件的文件夹.在我的本地计算机上,我想指向另一个文件夹.
我希望添加到类路径,理想情况下,所有项目,但添加到每个项目也没关系.我已经尝试更改Run > VM Options为包含类路径,但是通过该更改它找不到主类,我得到了java.lang.NoClassDefFoundError.我也尝试直接更改nbactions.xml以将类路径设置为-classpath ~\MyFolder\;%classpath,但这有同样的问题.
为了增加难度,服务器在我的本地机器运行Windows时运行linux.
如何从matlab运行clojure脚本?
我试过以下:用jdk 1.7运行matlab然后调用java
MATLAB_JAVA=/usr/lib/jvm/java-7-oracle/jre matlab
Run Code Online (Sandbox Code Playgroud)
在matlab中,设置classpath并使用clojure编译器
javaaddpath([pwd '/lib/clojure-1.5.1.jar'])
import clojure.lang.RT
Run Code Online (Sandbox Code Playgroud)
我在这里得到错误:
Error using import
Import argument 'clojure.lang.RT' cannot be found or cannot be imported.
Run Code Online (Sandbox Code Playgroud)
当我编写运行clojure的java类时,一切都在从控制台运行,但是不能从matlab运行.请指教.