JAR清单类路径不仅适用于Java Application Launcher

自从我开始学习Java以来​​,我几乎已经知道, 清单文件中的Class-Path标头字段为可执行JAR (具有由另一个称为Main-Class清单指定应用程序起点的 JAR)指定相对运行时类路径。 一个同事最近碰到一个让我感到惊讶,因为它证明了一个问题JAR文件的清单的Class-Path条目也影响编译时类路径时包含在类路径中包含JAR在运行javac的 。 这篇文章演示了这种新变化。

Java教程的部署跟踪的“ 将类添加到JAR文件的类路径 ”部分指出:“您指定要包含在applet或应用程序清单文件的Class-Path头字段中的Class-Path 。” 同一部分还指出:“通过使用清单中的Class-Path标头,可以避免在调用Java运行应用程序时指定长的-classpath标志。” 这两个句子从本质上总结了我一直如何想到清单文件中的Class-Path头:作为包含的JAR的类路径是通过Java应用程序启动器( java可执行文件)执行的。

事实证明,JAR清单中的Class-Path条目会影响Java编译器( javac ),就像它会影响Java应用程序启动器( java )一样。 为了演示这一点,我将使用一个简单的接口( PersonIF ),一个实现该接口的简单类( Person ),以及一个简单的Main类,该类使用实现该接口的类。 接下来显示这些的代码清单。

PersonIF.java

public interface PersonIF
{void sayHello();
}

人.java

import static java.lang.System.out;public class Person implements PersonIF
{public void sayHello(){out.println("Hello!");}
}

Main.java

public class Main
{public static void main(final String[] arguments){final Person person = new Person();person.sayHello();}
}

从上面的代码清单可以看出, Main类依赖于(使用) Person类,而Person类依赖于(实现) PersonIF 。 我将把PersonIF.class文件放在其自己的名为PersonIF.jar JAR中,并将该JAR存储在(不同的)子目录中。 Person.class文件将存在于其自己的Person.jar JAR文件中,并且该JAR文件包括一个MANIFEST.MF file ,该MANIFEST.MF fileClass-Path标头引用了相对子目录中的PersonIF.jar

manifestFileInPersonJar参考档案PersonIFJar

现在,我将尝试仅使用类路径中的当前目录从Main.java编译Main.class 。 我以前曾希望当javac无法在单独的子目录中找到PersonIF.jar时, javac会失败。 但是,它不会失败!

不明确地编译MainJava的情况下指定PersonIFOnCP

这让我感到惊讶。 当我没有明确指定PersonIF.class (或包含它的JAR)作为通过-cp标志提供的classpath的值时,为什么要编译此文件? 通过使用带有-verbose标志的javac可以看到答案。

compilingMainJavaWoutExplicitSpecifyPersonIFOnCP_verbose

javac -verbose的输出提供“ 文件的搜索路径”和“ 文件的搜索路径”。 在这种情况下,“类文件的搜索路径”很重要,因为我已经将PersonIF.javaPerson.java源文件移到了一个完全不相关的目录中,而不是在那些指定的搜索路径中。 有趣的是,即使我没有在-cp的值中指定此JAR(甚至目录),类文件的搜索路径(以及源文件的搜索路径)仍包含archive/PersonIF.jar 。 这表明Oracle提供的Java编译器考虑在类Class-Path上指定的任何JAR的MANIFEST.MFClass-Path标头中指定的类路径内容。

下一个屏幕快照演示了如何运行新编译的Main.class类,以及PersonIF.classarchive/PersonIF.jar获取依赖PersonIF.class archive/PersonIF.jar而无需在传递给Java应用程序启动程序的java -cp标志的值中指定依赖PersonIF.class 。 我希望运行时行为是这种方式,尽管坦白地说我从未尝试过,甚至从未考虑过使用其MANIFEST.MF文件没有Main-Class标头(不可执行的JAR)的JAR进行操作。 在此示例中, Person.jar清单文件未指定Main-Class头,而仅指定了Class-Path头,但是在使用java调用时仍能够在运行时使用此类路径内容。

本文的最后演示涉及从JAR文件中删除Class-Path标头和关联的值,并尝试使用javac和相同的命令行指定的classpath进行编译。 在这种情况下,包含Person.class的JAR被称为Person2.jar ,下面的屏幕快照演示了其MANIFEST.MF文件没有Class-Path标头。

Person2JarManifestWithoutClassPathForPersonIF

下一个屏幕快照展示了使用javac现在失败的原因,这是因为,正如预期的那样,没有在类路径上显式指定PersonIF.class ,并且不再通过引用JAR的MANIFEST.MF Class-Path头使它可用。类路径。

notCompilingMainWoutPersonIfInManifestClassPath

从上一个屏幕快照中我们可以看到,源文件和类文件的搜索路径不再包含archive/PersonIF.jar 。 没有可用的JAR, javac无法找到PersonIF.class并报告错误消息:“找不到PersonIF.class类文件。”

一般观察

  • MANIFEST.MF文件中的Class-Path标头不依赖于存在于同一JAR的MANIFEST.MF文件中的Main-Class标头。
    • 带有Class-Path清单标头的JAR将使这些类路径条目可用于Java类加载器,而不管该JAR是使用java -jar ...执行还是仅放置在较大的Java应用程序的类路径上。
  • 因为在JAR清单文件中使用Class-Path的范围不限于正在执行其Main-Class JAR,所以这些类可能潜在地无意中满足了类依赖关系(即使版本不正确),而不是解析明确指定的classpath条目。 在构造带有指定Class-Path清单的JAR时,或在清单文件中使用带有Class-Path的第三方JAR时,建议谨慎。
  • 有时低估了JAR清单文件的重要性,但是该主题提醒人们了解特定JAR清单文件中的内容的有用性。
  • 本主题提醒人们可以不时通过运行javac而无需-verbose来了解其最新信息而获得的见解。
  • 每当将JAR放置在javac编译器或java应用程序启动器的类路径上时,您不仅在类路径中的那个JAR中放置了更多的类定义,还包括了更多的类定义。 您还将放置该JAR清单清单的Class-Path引用的所有类和JAR到编译器或应用程序启动器的Class-Path上。

结论

Java类加载器可以在许多地方加载用于构建和运行Java应用程序的类。 正如本文所展示的,JAR的MANIFEST.MF文件的Class-Path头是另一个影响点,可以影响类加载器在运行时和编译时加载的类。 使用Class-Path不仅不会影响“可执行”的JAR(在清单文件中指定了Main-Class标头,并使用java -jar ...运行),而且可能会影响已加载的类以进行编译以及任何Java应用程序执行,其中带有包含Class-Path标头的清单文件的JAR位于类路径上。

翻译自: https://www.javacodegeeks.com/2015/09/jar-manifest-class-path-is-not-for-java-application-launcher-only.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL

在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点。开始创建一个以下内容的 HTML 文件,并在浏览器中打开。JavaScript URL parsing// 激动人心的代码即将写在这里如果你想尝试本文中的任何内容,可以…

正确使用计算机说课稿,《计算机结构原理初步》说课稿

在教师招聘考试的过程中,高中信息说课稿的难度就在于如何处理理论与实践的关系,希望这篇《计算机结构原理初步》说课稿能给予你帮助。各位考官大家好!我是号考生,今天我说课的题目是《计算机结构原理初步》。现代教学理论认为,在教…

计算机2013知识,2013年全国计算机一级考试B基本知识点五

基础5单元格操作对已建立的工作表,根据需要可以编辑修改其中的数据首先要移动单元格指针到目的地或选定编辑对象,然后才能进行增、删、改操作。1.单元格指针的移动要编辑某单元格,必须把单元格指针移动到该单元格,使之成为当前单元…

smartgwt_高级SmartGWT教程,第1部分

smartgwt贾斯汀(Justin),帕特(Pat)和我已经开始着手进行一个需要管理和管理用户界面的副项目。 在与SmartGWT和GWT共同工作了一段时间之后,我们决定使用SmartGWT创建接口。 我们非常喜欢视觉组件&#xff0…

计算机英语女人英语怎么说,英语时差:计算机和女人

00:0000:00微信扫码登陆,畅听全站所有音频!(20秒后自动关闭)X关注后,点此关闭https://online2.tingclass.net/lesson/shi0529/10000/10183/67.mp3https://image.tingclass.net/statics/js/2012When you hear the term, "computer geek,&…

云计算系统是大规模计算机系统吗,云计算的系统架构及技术探析

云计算技术属于计算机技术的一种,是目前计算机技术中应用以及研究重点之一,那么云计算到底是什么呢?云计算是在并行处理,分析式处理等技术的基础上发展而来的新技术,可以有效的将计算机进行整合,建立新颖的…

Vue 封装echarts柱状图(Bar)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 显示效果 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title" v-if"title">{{ title }}</div>…

smartgwt_高级SmartGWT教程,第2部分

smartgwt这是我的教程的第二部分&#xff0c;有关使用SmartGWT快速进行UI开发。 在本教程的第一部分中 &#xff0c;我们创建了基本的界面布局并添加了一些基本组件。 现在是时候解决这个问题&#xff0c;并使用SmartGWT的真正功能了。 在继续之前&#xff0c;让我们记住到目前…

百年理工计算机专业课程,这两所国内的百年理工院校,实力强劲,都是国内顶尖实力...

2021年全国高考终于圆满落下了帷幕&#xff0c;但考生们即将要面临一件人生大事&#xff0c;那就是高考志愿填报&#xff0c;因此高考虽然结束&#xff0c;但考生们的压力仍然是不小&#xff0c;只有正确地填好高考志愿&#xff0c;确保自己能够被心仪的高校收录取&#xff0c;…

数学图形之SineSurface与粽子曲面

SineSurface直译为正弦曲面.这有可能和你想象的正弦曲线不一样.如果把正弦曲线绕Y轴旋转,得到的该是正弦波曲面.这个曲面与上一节中的罗马曲面有些相似,那个是被捏过的正四面体,这个则是个被捏过正方体. 本文将展示SineSurface与粽子曲面的生成算法和切图,使用自己定义语法的脚…

计算机工程学院文艺例会,西航职院 | 计算机工程学院 2019年度学生会干部第一次例会...

原标题&#xff1a;西航职院 | 计算机工程学院 2019年度学生会干部第一次例会西航职院计算机工程学院&#xff0c;2019年度第一次学生会干部例会&#xff0c;于2月26日下午在四号教学楼201顺利召开。参加此次会议的有计算机学生会全体学生干部和指导老师刘老师。会议开始&#…

dateformat线程_Java最佳实践–多线程环境中的DateFormat

dateformat线程这是有关使用Java编程语言时的拟议实践的系列文章的第一篇。 所有讨论的主题均基于用例&#xff0c;这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的每个部分之前&#xff0c;强烈建议您参考相关的Java API文档以获取详细信息和代码示例。…

关于图连通性的几道题(水)

POJ 2186 强连通分量缩点 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 using namespace std;5 6 int en[10010], col[10010], dfn[10010], low[10010], stack[10010], tot[10010], chu[10010];7 bool ins[10010];8 int n, m, esize, dtime…

一台计算机硬盘容量标为800gb,一台计算机的硬盘容量标为800GB,其存储容量是()。...

台硬盘不适的装用于料是室外饰材。行的有_能进操作&#xff0c;计算机系统源管在W“资”中操作理器。不正有_确的&#xff0c;容量下列叙述中。的有描述正确&#xff0c;其存文输的中s系统下关于入。文档选定应_整篇&#xff0c;储容d文档编在W辑中。不能作进行_操&#xff0c;…

jQuery验证插件

jQuery验证插件 原文:jQuery验证插件学习要点&#xff1a; 1.使用 validate.js 插件 2.默认验证规则 3.validate()方法和选项 4.validate.js 其他功能 验证插件&#xff08;validate.js&#xff09;&#xff0c;是一款验证常规表单数据合法性的插件。使用它&#xff0c;极大的解…

爱思助手更新后无法连接服务器,爱思助手出现无法连接或连接超时的操作教程...

使用爱思助手的用户很多&#xff0c;一些新用户不清楚出现无法连接或连接超时怎样处理&#xff0c;今天小编给大家带来在爱思助手出现无法连接或连接超时的操作教程&#xff0c;希望可以帮到大家。爱思助手出现无法连接或连接超时的操作教程一、数据线和电脑USB接口正常状态请确…

计算机演示题打不开,大神为你演示win7系统计算机上右键管理打不开的还原技巧...

当我们经常使用的电脑工作的时候&#xff0c;时间久了难免会遇到win7系统计算机上右键管理打不开的问题&#xff0c;如今就有用户反映在使用电脑的时候遇到win7系统计算机上右键管理打不开的情况不知怎么解决&#xff0c;针对这个问题小编就整理总结出win7系统计算机上右键管理…

apache lucene_Apache Lucene拼写检查器的“您是不是要”功能

apache luceneGoogle的“您是不是要”功能 在上一篇文章中对Lucene进行了介绍之后 &#xff0c;现在是时候提高它并创建一个更复杂的应用程序了。 您肯定最熟悉Google的“您是不是要”功能&#xff08;其他搜索引擎也支持此功能&#xff09;。 这是一个例子&#xff1a; Luce…

荣耀6手机常显示无法链接服务器怎么处理,华为手机连接上WiFi上不了网怎么办...

华为手机(Mate7,荣耀6 Plus,荣耀6,P7) 连接上WiFi上不了网怎么办每当小编被遇到这样的问题&#xff0c;小编都会深深的醉一把。这样的问题就应该被消灭在火星上&#xff0c;谁让他来地球的。网络就像一张大网&#xff0c;哪个节点有问题都可能导致WIFI连上无法上网&#xff0c;…

jboss 配置上下文路径_JBoss Portal上的“ Hello World” portlet

jboss 配置上下文路径Portlet概述 本教程将向您展示如何创建和部署简单的Portlet。 Portlet是基于Java技术的Web组件&#xff0c;可以处理请求并生成动态内容。 Portlet不是自治实体&#xff0c;但是由Portlet容器管理&#xff0c;Portlet容器为Portlet执行提供了必要的运行时…