是否可以在java中动态“添加”到类路径?

2023-12-11

java -classpath ../classes;../jar;. parserTester

如何以编程方式获取上述命令中的功能?就像,是否可以运行为:

java parserTester

并得到相同的结果?我尝试使用 URLClassLoader 但它修改了类路径并且没有添加到它。

Thanx!


感谢米尔豪斯的回复。但这就是我想要做的。如何才能首先将 jar 放入类路径中?我也尝试使用自定义类加载器:(

那是有效的..但抱歉,我只需要运行它: java解析器测试器 我想知道这样的事情是否可能???

它需要如此,因为我有 parserTester.java 和 .class 在一个单独的文件夹中。我需要保留文件结构。 parserTester 使用单独的 jar 文件夹中的 jar。


您可以使用 java.net.URLClassLoader 来加载具有您希望的任何程序定义的 URL 列表的类:

公共类 URLClassLoader 扩展 SecureClassLoader

这个类加载器用来加载 搜索中的类和资源 引用两个 JAR 的 URL 路径 文件和目录。任何网址 以“/”结尾的被假定为引用 一个目录。否则,URL 为 假设引用一个 JAR 文件 将根据需要打开。

线程的AccessControlContext 创建了实例 URLClassLoader 将在以下情况下使用 随后加载类和 资源。

加载的类是由 默认仅授予权限 访问指定的 URL URLClassLoader 已创建。

自从: 1.2

一些花哨的步骤可以扩展它以支持使用通配符路径名来获取 JAR 的整个目录(此代码有一些对实用程序方法的引用,但它们的实现在上下文中应该是显而易见的):

/**
 * Add classPath to this loader's classpath.
 * <p>
 * The classpath may contain elements that include a generic file base name.  A generic basename
 * is a filename without the extension that may begin and/or end with an asterisk.  Use of the
 * asterisk denotes a partial match. Any files with an extension of ".jar" whose base name match
 * the specified basename will be added to this class loaders classpath.  The case of the filename is ignored.
 * For example "/somedir/*abc" means all files in somedir that end with "abc.jar", "/somedir/abc*"
 * means all files that start with "abc" and end with ".jar", and "/somedir/*abc*" means all files
 * that contain "abc" and end with ".jar".
 *
 */
public void addClassPath(String cp) {
    String                              seps=File.pathSeparator;                // separators

    if(!File.pathSeparator.equals(";")) { seps+=";"; }                          // want to accept both system separator and ';'
    for(StringTokenizer st=new StringTokenizer(cp,seps,false); st.hasMoreTokens(); ) {
        String pe=st.nextToken();
        File   fe;
        String bn=null;

        if(pe.length()==0) { continue; }

        fe=new File(pe);
        if(fe.getName().indexOf('*')!=-1) {
            bn=fe.getName();
            fe=fe.getParentFile();
            }

        if(!fe.isAbsolute() && pe.charAt(0)!='/' && pe.charAt(0)!='\\') { fe=new File(rootPath,fe.getPath()); }
        try { fe=fe.getCanonicalFile(); }
        catch(IOException thr) {
            log.diagln("Skipping non-existent classpath element '"+fe+"' ("+thr+").");
            continue;
            }
        if(!GenUtil.isBlank(bn)) {
            fe=new File(fe,bn);
            }
        if(classPathElements.contains(fe.getPath())) {
            log.diagln("Skipping duplicate classpath element '"+fe+"'.");
            continue;
            }
        else {
            classPathElements.add(fe.getPath());
            }

        if(!GenUtil.isBlank(bn)) {
            addJars(fe.getParentFile(),bn);
            }
        else if(!fe.exists()) {                                                 // s/never be due getCanonicalFile() above
            log.diagln("Could not find classpath element '"+fe+"'");
            }
        else if(fe.isDirectory()) {
            addURL(createUrl(fe));
            }
        else if(fe.getName().toLowerCase().endsWith(".zip") || fe.getName().toLowerCase().endsWith(".jar")) {
            addURL(createUrl(fe));
            }
        else {
            log.diagln("ClassPath element '"+fe+"' is not an existing directory and is not a file ending with '.zip' or '.jar'");
            }
        }
    log.diagln("Class loader is using classpath: \""+classPath+"\".");
    }

/**
 * Adds a set of JAR files using a generic base name to this loader's classpath.  See @link:addClassPath(String) for
 * details of the generic base name.
 */
public void addJars(File dir, String nam) {
    String[]                            jars;                                   // matching jar files

    if(nam.endsWith(".jar")) { nam=nam.substring(0,(nam.length()-4)); }

    if(!dir.exists()) {
        log.diagln("Could not find directory for Class Path element '"+dir+File.separator+nam+".jar'");
        return;
        }
    if(!dir.canRead()) {
        log.error("Could not read directory for Class Path element '"+dir+File.separator+nam+".jar'");
        return;
        }

    FileSelector fs=new FileSelector(true).add("BaseName","EG",nam,true).add("Name","EW",".jar",true);
    if((jars=dir.list(fs))==null) {
        log.error("Error accessing directory for Class Path element '"+dir+File.separator+nam+".jar'");
        }
    else if(jars.length==0) {
        log.diagln("No JAR files match specification '"+new File(dir,nam)+".jar'");
        }
    else {
        log.diagln("Adding files matching specification '"+dir+File.separator+nam+".jar'");
        Arrays.sort(jars,String.CASE_INSENSITIVE_ORDER);
        for(int xa=0; xa<jars.length; xa++) { addURL(createUrl(new File(dir,jars[xa]))); }
        }
    }

private URL createUrl(File fe) {
    try {
        URL url=fe.toURI().toURL();
        log.diagln("Added URL: '"+url.toString()+"'");
        if(classPath.length()>0) { classPath+=File.pathSeparator; }
        this.classPath+=fe.getPath();
        return url;
        }
    catch(MalformedURLException thr) {
        log.diagln("Classpath element '"+fe+"' could not be used to create a valid file system URL");
        return null;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在java中动态“添加”到类路径? 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • 找不到 webdriverprefs.json - pyinstaller

    我有一个使用 selenium 包的 python 程序 当使用它创建 exe 时pyinstaller它正确创建了exe 当尝试从此应用程序打开 Firefox 时 出现以下错误 IOError Errno 2 No such file
  • 传递多个值到 switch,用逗号分隔值

    我可以将多个值传递给 switch case 语句并用逗号分隔不同的值吗 该表达式的计算结果是什么 如果没有发生错误 编译器将使用多个值中的哪一个来评估开关 还记得逗号运算符的低优先级吗 比如说我写的代码如下 int m 10 switch
  • 使用 Firebase Android 排序数据

    我遇到了一个奇怪的问题 其中 Firebase 查询使用orderByChild 实际上并不对数据进行排序 以下是我尝试订购的数据的快照 出于本示例的目的 总计已关闭 这是我到目前为止使用过的代码 Query query locationC
  • 将 Docker 部署到 AWS Elastic Beanstalk — 如何将端口转发到主机? (端口绑定)

    我有一个用 CircleCI 设置的项目 我用它来自动部署到 Elastic Beanstalk 我的 EBS 环境是单个容器 自动扩展的 Web 环境 我正在尝试运行一个侦听原始套接字端口 8080 的服务 我的 Dockerfile F
  • jQuery - 如果选择了 > 1 个复选框,如何显示消息?

    取决于数量n用户的记录中拥有的汽车数量 将会有n可供选择的复选框 在我看来 这些复选框是使用循环呈现的 如果用户选择 gt 1 个复选框 我想显示一条消息 所以 x Honda Toyota Suzuki no message shown
  • 查询父模型时可以过滤关系的内容吗?

    我有两个代表电影及其放映时间的模型 我想查询所有电影 但他们show times关系应该只包含未来的那些表演时间 class PKMovie db Model id db Column db Integer primary key True
  • C# winforms 中表单之间传递数据的最安全方法

    我试图记住我在学校简要学到的关于在 winform 之间安全传递数据的一课 我的导师叫它流水线 尽管我不确定这是正确的术语还是仅仅是他自己的名字 他表示 他的方法比公开数据以便所有人都可以访问数据的最简单方法更安全 他说这更安全 因为他的方
  • 在 test.each 中使用变量表达式 Jest

    下面是我的代码片段 describe Upper Describe gt let value beforeEach gt value require testModule value it each value test something
  • 在 R 中解析 XML 文件(>1 MB)

    目前 我有大约 20 000 个 XML 文件 大小从几 KB 到几 MB 不等 虽然它可能并不理想 但我使用 XML 包中的 xmlTreeParse 函数来循环遍历每个文件并提取我需要的文本并将文档保存为 csv 文件 下面的代码适用于
  • 从 MPSC 通道成功接收后进程永远不会退出

    这是代码 use std thread use std sync mpsc fn main spawn threads let tx rx mpsc channel for mut i in 0 10 let txc tx clone cl
  • 停机问题到底是什么?

    每当人们询问与编程有关的停止问题时 人们都会回答 如果你只添加一个循环 你就会得到停止程序 因此你无法自动化task 说得通 如果你的程序有一个无限循环 那么当你的程序运行时 你无法知道程序是否仍在处理输入 或者它是否只是无限循环 但其中一
  • 为什么由 /.../ 创建的 javascript RegExp 可以工作,但通过“new RegExp”创建的相同内容却不能?

    我很困惑这里有什么区别以及为什么一个有效而另一个无效 有人可以解释一下吗 The string to search through var str This is a string with some stuff in here This
  • Gson 序列化 POJO 的 ArrayList 时出现问题

    我一直计划使用 simpleXML 来满足我的序列化需求 但我想我应该尝试一下 JSON 以学习新的东西 这是我用来尝试使用 Gson 1 7 1 序列化测试 POJO 的 ArrayList 的代码 注意 我删除了字符串 s 的读取器 写
  • 与计算域的剔除映射

    我从 WCF 服务获取数据 然后映射数据并将其与 DOM 对象绑定 var PayinyVM getJSON service PaidService svc PaidList function data var tmp JSON strin
  • Android 无法通过 AlarmManager 传递意图附加信息

    我试图在我的意图中添加一条额外的消息 以传递给 AlarmManager 以供稍后触发 我的 onReceive 正确触发 但 extras getString 返回 null Setup public PendingIntent getP
  • watir-webdriver - 单击 Javascript 按钮

    第一周进行 watir webdriver 和 Web 应用程序测试 因此仍在尝试概括一些概念 有这个 javascript 元素
  • 如何在打开新网页后继续VBA代码

    我是创建 VBA 代码的新手 并且正在慢慢对其有基本的了解 但是如果没有帮助 我无法通过项目的这一点 我有下面的代码并且运行良好 直到我需要在打开的新页面上继续该代码 我不知道如何继续代码 计划是能够单击赔率比较选项卡并从该页面提取数据 任
  • Outlook 类似于侧边栏并在 Outlook 中显示

    我正在使用VS2008 想尝试应用程序的Outlook样式显示 请指导我如何拥有像侧边栏和类似显示的外观 是否可以使用现有的控件 另请注明这些是否是 WPF 控件 thanks 以下是 CodeProject 中的几个示例 http www
  • 正则表达式 (Javascript) - 取一个打乱的单词并找到一个未打乱的匹配项

    我有一个英语词典中所有单词的列表 270 000 多个单词 存储在一个名为的变量中theList 我有一个乱码word我想通过与单词列表匹配来解读 最初 我认为下面的代码可以解决问题 但效果不太好 var theList Contains
  • 是否可以在java中动态“添加”到类路径?

    java classpath classes jar parserTester 如何以编程方式获取上述命令中的功能 就像 是否可以运行为 java parserTester 并得到相同的结果 我尝试使用 URLClassLoader 但它修