精华内容
下载资源
问答
  • 源链接:...但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找出来了。看看下面的代码:Java代码//源代码1:packageedu.hxraid;importjava.io...

    源链接:

    http://hxraid.iteye.com/blog/483115#comments

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:

    Java代码

    //源代码1:

    package edu.hxraid;

    import java.io.*;

    public class Resource {

    public  void getResource() throws IOException{

    File file=new File("bin/resource/res.txt");

    BufferedReader br=new BufferedReader(new FileReader(file));

    String s="";

    while((s=br.readLine())!=null)

    System.out.println(s);

    }

    }

    这段代码写在Eclipse建立的java Project中,其目录为:(其中将资源文件res.txt放在了bin目录下,以便打成jar包)

    1、src/

    src/edu/hxraid/Resource.java

    2、bin/

    bin/resource/res.txt

    bin/edu/hxraid/Resource.class

    很显然运行源代码1是能够找到资源文件res.txt。但当我们把整个工程打成jar包以后(ResourceJar.jar),这个jar包内的目录为:

    edu/hxraid/Resource.class

    resource/res.txt

    而这时jar包中Resource.class字节码:ldc

    [20]

    将无法定位到jar包中的res.txt位置上。就算把bin/目录去掉:ldc

    [20] 仍然无法定位到jar包中res.txt上。

    这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource

    /res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。

    那么把资源打入jar包,无论ResourceJar.jar在系统的什么路径下,jar包中的字节码程序都可以找到该包中的资源。这会是幻想吗?

    当然不是,我们可以用类装载器(ClassLoader)来做到这一点:

    (1)

    ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。

    可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:

    ● public URL getResource(String name)

    查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。

    ● public InputStream getResourceAsStream(String name);

    返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

    (2)

    ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法

    。好了,现在我们重新写一段Resource代码,来看看上面那段费解的话是什么意思了:

    Java代码  d1691c30c6d132d6a4beb02a2a7e279b.png

    //源代码2:

    package edu.hxraid;

    import java.io.*;

    import java.net.URL;

    public class Resource {

    public  void getResource() throws IOException{

    //查找指定资源的URL,其中res.txt仍然开始的bin目录下

    URL fileURL=this.getClass().getResource("/resource/res.txt");

    System.out.println(fileURL.getFile());

    }

    public static void main(String[] args) throws IOException {

    Resource res=new Resource();

    res.getResource();

    }

    }

    运行这段源代码结果:/E:/Code_Factory/WANWAN/bin/resource/res.txt

    (../

    Code_Factory/WANWAN/..

    是java project所在的路径)

    我们将这段代码打包成ResourceJar.jar

    ,并将ResourceJar.jar放在其他路径下(比如 c:\ResourceJar.jar)。然后另外创建一个java

    project并导入ResourceJar.jar,写一段调用jar包中Resource类的测试代码:

    Java代码  d1691c30c6d132d6a4beb02a2a7e279b.png

    import java.io.IOException;

    import edu.hxraid.Resource;

    public class TEST {

    public static void main(String[] args) throws IOException {

    Resource res=new Resource();

    res.getResource();

    }

    }

    这时的运行结果是:file:/C:/ResourceJar.jar!/resource/res.txt

    我们成功的在运行时动态获得了res.txt的位置。然而,问题来了,你是否可以通过下面这样的代码来得到res.txt文件?

    File f=new File("C:/ResourceJar.jar!/resource/res.txt");

    当然不可能,因为".../ResourceJar.jar!/resource/...."并不是文件资源定位符的格式

    (jar中资源有其专门的URL形式:

    jar:!/{entry}

    )。所以,如果jar包中的类源代码用File f=new File(相对路径);的形式,是不可能定位到文件资源的。这也是为什么源代码1打包成jar文件后,调用jar包时会报出FileNotFoundException的症结所在了。

    (3)

    我们不能用常规操作文件的方法来读取ResourceJar.jar中的资源文件res.txt,但可以通过Class类的getResourceAsStream()方法来获取

    ,这种方法是如何读取jar中的资源文件的,这一点对于我们来说是透明的。我们将Resource.java改写成:

    Java代码  d1691c30c6d132d6a4beb02a2a7e279b.png

    //源代码3:

    package edu.hxraid;

    import java.io.*;

    public class Resource {

    public void getResource() throws IOException{

    //返回读取指定资源的输入流

    InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");

    BufferedReader br=new BufferedReader(new InputStreamReader(is));

    String s="";

    while((s=br.readLine())!=null)

    System.out.println(s);

    }

    }

    我们将java工程下/bin目录中的edu/hxraid/Resource.class和资源文件resource/res.txt一并打包进ResourceJar.jar中,不管jar包在系统的任何目录下,调用jar包中的Resource类都可以获得jar包中的res.txt资源,再也不会找不到res.txt文件了。

    展开全文
  • IDEA识别jar包中的类

    2021-06-14 15:21:50
    一个老项目,原来用eclipse和老版本的idea编译都没问题,换了一个较新版本的idea后,项目中有几个jar包突然识别了,idea发现了其中的class,编译也没问题,但是会有错误提示

    一个老项目,原来用eclipse和老版本的idea编译都没问题,换了一个较新版本的idea后,项目中有几个jar包突然不识别了,idea发现不了其中的class,编译、运行也都没问题,但是编辑器会有错误提示找不到类。

    用rar打开感觉jar包也没啥问题,网上找了一圈没人说过这个问题,有别的情况jar包不识别的,有人给出的方案是把jar包解压缩出来引用,这个我觉得太麻烦了,后面使用太啰嗦了,后来想到会不会是jar包的格式有问题,导致idea无法正常解压但是rar可以解压,就包jar包解出来后,用jdk自带的jar工具又压缩了一遍,然后就正常了。

    看来我的猜测没错,但到底是哪里出了问题呢,用比较软件比较一下,发现唯一的差别是其中的MANIFEST.MF文件,逐个试验发现是其中多了一个Build-by属性,查阅文件规范发现虽然标准没有这个属性,但是是可以有自定义属性的,这应该是idea的一个bug吧。

    展开全文
  • 到或无法加载主类什么意思

    千次阅读 2021-03-14 18:21:53
    今天我们将探讨java的一个常见问题,即如何修复java中的“error:...如果你熟悉类路径,那么请检查一下什么是类路径以及它与路径的区别。如果java查找所有类文件的CLASSPATH环境变量未找到类,则会出现“...

    今天我们将探讨java的一个常见问题,即如何修复java中的“error:couldnotfind or load main class”错误。顾名思义,当java找不到您要执行的类时,就会发生这个错误。为了更好地理解错误,您应该熟悉类路径CLASSPATH。如果你不熟悉类路径,那么请检查一下什么是类路径以及它与路径的区别。

    如果java查找所有类文件的CLASSPATH环境变量未找到类,则会出现“找不到或无法加载主类:XXX”,其中类名为XXX。

    63468371bcdcd51fd068b96b6bf35e2e.png

    1. 从java命令调用.class文件

    public class HelloWorld {

    public static void main(String args[]) {

    System.out.println(" You have just run HelloWorld !");

    }

    }

    假设我有一个简单的HelloWorldJava程序。如果我用命令编译它

    javac HelloWorld.java

    那么HelloWorld.class类文件已创建。

    如果尝试使用java命令运行.class文件,则会出现以下错误:

    java HelloWorld.class

    你应该试试:

    java HelloWorld

    耶!!你的问题解决了。

    You have just run HelloWorld !

    2. 如果你的casing不正确

    编译代码后,运行以下命令

    java helloworld

    然后出现“找不到或加载主类helloworld”错误。确保套管正确。在我们的程序中,它应该是HelloWorld(其中hello的'H'和world的'W'是大写的)。

    java HelloWorld

    耶!它可以很好的打印出来

    You have just run HelloWorld !

    3. 在包中初始化

    在下面的示例中,有个HelloWorld类在com.javahunger包。

    package com.javahungry;

    /**

    * Java program to demonstrate

    * Error :Could not find or load main class

    *

    * @author Subham Mittal

    */

    public class HelloWorld {

    public static void main(String args[]) {

    System.out.println(" You have just run HelloWorld !");

    }

    }

    如果你试着去调用:

    java HelloWorld

    它将导致错误:无法找到或加载主类HelloWorld。发生此错误是因为必须使用其完全限定名调用它。很明显,这个类的名称不是HelloWorld,而是com.javahungry.HelloWorld. 尝试执行HelloWorld无效,因为不存在具有该名称的类。反正不在当前类路径上。

    java com.javahungry.HelloWorld

    上述命令还将导致错误:无法找到或加载主类HelloWorld,因为未设置CLASSPATH环境变量。我不使用-cp命令来指定路径。默认情况下,java在默认目录中搜索类文件。

    java -cp . com.javahungry.HelloWorld

    如果classpath类路径正确,那么上面的命令将运行HelloWorld程序。否则,还会导致错误:无法找到或加载主类HelloWorld,因为-cp .命令确保JVM在当前目录中查找类文件。

    如果错误仍然存在,请执行以下步骤。

    必须确保.class文件的位置已添加到类路径中。假设“/Users/SubhamMittal/Desktop/”在类路径classpath上,JVM查找名为com.javahungry.HelloWorld,它将在以下路径中查找.class文件:

    “/Users/SubhamMittal/Desktop/com/javahungry/HelloWorld”

    java -cp /Users/SubhamMittal/Desktop/ com.javahungry.HelloWorld

    耶!它会打印出来

    You have just run HelloWorld !

    上面的例子是在macos上执行的。

    4. 在Windows操作系统的包中初始化

    假设编译后的java类即HelloWorld(如上所示)位于下面的路径中

    D:\project\com\javahungry\

    HelloWorld类的全名是

    com.javahungry.HelloWorld

    所以用cd .. 返回命令以到达主目录

    D:\project

    然后发出java命令

    java com.javahungry.HelloWorld

    耶!程序在没有设置任何类路径的情况下成功运行。这是因为java正在寻找由.(dot)表示的当前目录,并且能够找到.\com\javahunger\HelloWorld.class类.

    它会打印出来

    You have just run HelloWorld !

    5. 将CLASSPATH设置为当前目录

    如果.class文件在当前文件夹中,则设置. 到类路径CLASSPATH(注意,在Windows中,类路径分隔符是分号;而在Linux中,分隔符是冒号:)。

    您可以在Windows中设置类路径:

    set CLASSPATH = %CLASSPATH%;.

    (注 . 最后为当前目录添加)

    您可以在Linux中设置类路径:

    export CLASSPATH = ${CLASSPATH}:.

    (注.最后为当前目录添加)

    如果您使用的是java 1.5或1.6,则不会出现错误:java.lang.NoClassDefFoundError : HelloWorld。从JDK1.7开始,我们就收到了这个新错误。好消息是,解决方案完全相同。

    展开全文
  • public abstract class Control {protected int getHeight() {//..}//...}此外,在同一个包中,有一个继承的类:package bg.svetlin.ui.controls;public abstract class LayoutControl extends...

    假设有以下基类:

    package bg.svetlin.ui.controls;

    public abstract class Control {

    protected int getHeight() {

    //..

    }

    //...

    }

    此外,在同一个包中,有一个继承的类:

    package bg.svetlin.ui.controls;

    public abstract class LayoutControl extends Control {

    public abstract void addControl(Control control);

    //...

    }

    然后,在另一个包中有第三个类:

    package bg.svetlin.ui.controls.screen;

    public abstract class Screen extends LayoutControl {

    //...

    }

    最后,还有一个实现类,在另一个包中:

    package bg.svetlin.ui.controls.screen.list;

    public class List extends Screen {

    private final Vector controls = new Vector();

    public void addControl(Control control) {

    height += control.getHeight();

    controls.addElement(control);

    }

    }

    即使List继承自Control,并且getHeight()受到保护,也会出现以下错误:

    getHeight() has protected access in bg.svetlin.ui.controls.Control

    我检查过我的进口是对的.我正在使用NetBeans.

    知道什么是错的吗?我认为孩子们可以看到受保护的字段和方法,即使后者是在不同的包中.

    谢谢!

    展开全文
  • 般多的方斜拉桥斜测定采用法一拉索索力,包中不考(检测员。得税下列某企业所纳税支出中人发生的,包中不得的有扣除额时纳税在计算应所得。下列中各项,包中消费应当有(缴纳税的,度的消费根据规定律制...
  • I am implementing a java program in ubuntu without an IDE that converts a currency to €, i have 2 classes ConvertiEuro and Valuta both in the same directory (package) called finanza, the class ...
  • 请根据网页显示的效果图(如图12-4所...<html><head>!-- TcmplateBeginEditable name='doctitle' -->论坛登录注意事项</title><!-- TemplateEndEditable --><meta. http-equiv='Content-Type' content='te...
  • java-client-2.0.0.jar</systemPath> </dependency> ${project.basedir}子项目根目录开始 springboot项目打包后找到ais-java-client-2.0.0.jar,这个包 解决方式:如果只是一个项目,就在这个项目中导入: ...
  • 我的问题是,当我将RestController放在像主类一样的包中时 – 它可以,但我想将它分发给其他包,当我创建新包时,移动RestController它起作用.让我们解释一下:我的项目看起来像:|-Springtestv_01|-src/main/java|--...
  • 上一次说到了Java中的继承,当然了,有些父类中的成员变量和方法就能被子类继承,这是父类的成员变量和方法的访问权限的问题。虽然子类继承父类之后,可以将父类中的成员变量和方法当作像是自己定义的一样,直接拿...
  • 多模块开发中遇到 自动注入找到bean。 通过这篇文章巩固了知识并解决了该问题 Spring Boot 多模块注入访问到jar包中的Bean问题_从心初发-CSDN博客
  • 问题 Project A 引用了 b.jar,本身编译正常,无报错;...424) at sun.misc.Launcher$... 如果mvn dependency:tree提示 Project A 自己的module 在仓库中,可以先mvn clean install -Dtest.skip 一下 图片.png
  • 下列现A心率哪项头晕、属包中面加快压其临不是白、床表出汗色苍收缩,性低血压者易直立卧床长期产生。,定义的事花坛模纹计以据为依的色彩设。狭窄性腱线疗红外.紫鞘炎波疗外线疗法蜡疗.冷疗法超短法B法D法E首选....
  • 有关poi jar包中到XSSFWorkbook相关类的问题 处理excel文件一般使用poi,而使用maven引入poi的jar包如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
  • 修改jar包的情况下,对jar包中的代码逻辑进行更新 最近遇到一个问题,项目中引用了一个远古ar包,方便直接更新jar包,但是其中涉及的某个类的实现因为迭代,需要更新了。问题是方便更新jar,原因很多。总之...
  • //TestOne.javapackagemoon.star;... 个人认为TestThree没有在包中,那就默认在无名包中,TestThree和Other在同一目录下,Other应该能找到TestThree,尽管Other经过编译后的字节码文件在别的包中。 展开
  • 到对应的fastjson的类,以及fastjson.jar包中所有包含的函数,当时博主找了很久的资料才找到解决的方案。 ​ 这学期博主的同学在使用eclipse进行Java EE的学习的时候也遇到了同样的问题,再导入了链接My
  • 但是,在导入任何类时-如果您要导入的类/接口的路径对JVM可用。如果您在import语句中提到的绝对类名正确(包括包和类名)。如果已导入使用的类/接口。您将看到一个异常提示“找到符号……”。示例在下面的示例中...
  • does not override the inherited method from MyClass since it is private to a different package 这是什么意思?是的,这些类位于不同的项目和不同的包中,但是这与继承有什么关系?这两种方法都是公共的。 下面...
  • ls是什么意思(精通 Linux 的 ls 命令)Linux 的 ls 命令拥有数量惊人的选项,可以提供有关文件的重要信息。-- Seth Kenlon(作者)ls 命令可以列出一个 POSIX 系统上的文件。这是一个简单的命令,但它经常被低估,不是...
  • maven发布jar包运行时找到类问题

    千次阅读 2021-02-03 16:43:17
    我们有个公共类库,编译成jar包,供其他项目调用。...为什么放在这里,就找到呢?知道。我目前还知道原因。但是,开发阶段,在idea里运行就好好的。看来还是打包的问题。 为啥公共类库包会放在BOOT-INF
  • java中class什么意思

    千次阅读 2021-02-12 11:13:31
    class的意思为“类”,是java中的一个类,是定义一个特定类的实现,存在于java.lang包中,它的构造函数是私有的,由JVM(类加载器)创建Class对象,可以通过getClass()方法获取到Class对象。class是一个类,存在于java...
  • java.lang包中不能被继承的类: public final class Byte public final class Character public static final class Character.UnicodeBlock public final class Class<T> public final class Compile ...
  • java中?:是什么意思

    千次阅读 2021-02-28 17:56:01
    展开全部java api是java提供的一些预定义函数,目的是提供应用e69da5e6ba9062616964757a686964616f...API的全称是Application Programming Interface,翻译过来是应用程序编程接口的意思。JAVA API文档...
  • java中import关键字是什么意思

    千次阅读 2021-02-12 22:09:34
    import关键字是用来导入包的,因为实际开发中,你可能把所有的类都放在同一个default包里面。包的作用就是给java类进行分拣,不同业务逻辑的java类放在同一个包中,比如工具包,实体包。那么,你在a包中的A类,...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼请问在同一个包中和在同一个源文件有什么区别??????以下子类和父类在同一个源文件中,如何保存为在同一个包中?class Father{ private int money;int weight;int ...
  • java中的class是什么意思

    千次阅读 2021-02-26 08:51:16
    java中的class代表类,class类存在于java.lang包中。在Java中,每个class都有一个相应的Class对象。当我们编写一个类并进行编译后,在生成的【.class】文件中就会产生一个Class对象,它用于表示这个类的类型信息。...
  • 如何修改jar包中的内容背景:我们的java项目发布后通常会打包成jar包、或者war包,但是有一些配置文件是同jar包打在一起的。如果想要在打包之后修改配置文件,就有点问题了。这里介绍在打包后修改jar包内容的方法ps...
  • I Have following two classes:Test.javapackage ...public class Test {public int a=10;protected void testFunc() {// TODO Auto-generated method stubSystem.out.println("Test class--> testFunc...
  • LS 的服务器上安装一个包,使用 rpm -qlp * 可以看到列表中有对应的库文件 安装之后在对应的目录中没有知道这些文件 ...清楚什么问题 然后使用强制安装之后,这里文件出来了 这个玄学怎么处理? ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,179
精华内容 168,871
关键字:

不包中什么意思