专业编程培训机构——完成蜕变以后轻松拿高薪
电话+V:159999-78052 ,欢迎咨询在编译时缺少模块怎么办,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
一、怎么编译时找不到指定模块?
在编程过程中,如果出现了“找不到指定模块”的提示,通常是由于程序中引用的某个模块不存在或者无法访问。这种错误一般发生在程序较为复杂的情况下,比如运行程序时,某些模块没有被正确地加载或者路径被改变,会导致无法找到相应的模块。解决该问题,可以通过查看程序是否有相关的模块以及模块路径是否正确,如果确认模块存在,可以尝试重新安装模块以及重启程序等方式解决。
当程序中缺少所需模块时,会提示“找不到指定模块”错误。这种情况一般发生在缺少一些运行时所需的库文件或者程序需要用到一些特定的模块。在解决这个问题时,可以通过查看程序所需的模块是否已经安装以及是否被正确引用来确定问题所在。另外,还可以通过在线获取相应的库文件或者模块来解决这个问题。同时,也要确保所用的库文件和模块版本是否与程序所需的版本一致。
“找不到指定模块”的错误提示,有可能是由病毒感染造成。病毒感染可能会损坏模块,并使得程序无法正确运行。在这种情况下,需要使用杀毒软件进行检查和清除,确保系统和程序的安全性。另外,也要注意在下载模块或者软件时,选择可靠和安全的来源,避免下载到带有病毒的文件。同时,定期更新杀毒软件也是保持系统安全的一种有效手段,不仅能够杀毒,还能够修复系统文件,提高系统的稳定性。
二、openwrt编译ipk时怎么找到模块
编译的时候
以下为网友遇到的问题
Packagehelloworldismissingdependenciesforthefollowinglibraries:libc.so.6libpthread.so.0
缺少类库,然后其实我发现我的类库在系统里是存在的:
locatelibc.so.6
结果:
/lib/i386-linux-gnu/libc.so.6
/lib/i386-linux-gnu/libpthread.so.0
/lib64/libc.so.6
大牛前辈教我的“模块”骚操作让我代码减少60%,太强了
2024-01-2013:44·程序员xysam一编译和打包模块
在将项目整齐地组织在特定模块的目录中,创建了模块声明并编写了代码后,就可以构建并(稍后)运行应用程序了。要构建应用程序,你需要创建模块工件,这个过程分为两步:编译和打包。在编译时,编译器需要知道声明引用的模块位置,对Java自身的模块而言这轻而易举,因为编译器知道依赖位于何处(在运行时环境的libs/modules文件中)。要点为了能找到自己的模块,人们必须使用模块路径,即一个与类路径平行的概念。顾名思义,它期望存放模块化JAR而不是普通JAR。当编译器搜索引用的模块时,会对它进行扫描。为了定义模块路径,javac增加了一个新选项:--module-path,或简称-p(思路与JVM启动应用程序时相同。相应地,java引入了相同的选项--module-path和-p,它们具有相同的功能)。选择mods目录存放模块意味着以下两点:1)模块路径包含mods目录;2)mods目录包含已打包的工件。某些模块具有外部依赖:persistence模块需要Hibernate(hibernate.jpa),而REST模块需要Spark(spark.core)。假设它们的工件已经是模块化的JAR,与其依赖项一起被放在了mods目录中。如果将普通JAR放在模块路径上,或者将模块化JAR放在类路径上,甚至混合搭配会发生什么情况?如果依赖尚未模块化但你想使用它,该怎么办?这些属于向模块化迁移的内容,以后将详细说明。基于这些先决条件,可以编译和打包模块。从monitor.observer开始,它没有依赖项,不包含任何新内容——使用旧版本的Java来运行也会获得相同的结果。monitor.alpha模块有依赖项,因此必须使用模块路径来告诉编译器在哪里可以找到所需的工件。当然,用jar命令打包不受其影响。大多数其他模块大致相同。一个例外是monitor.rest,它有位于libs目录中的第三方依赖项,因此需要将libs添加到模块路径中。另一个例外是monitor,需要告知模块系统它有一个作为应用程序入口点的main函数。图2-6显示了最终内容。这些JAR文件就像普通的旧JAR,但有一点例外:每个文件都包含一个模块描述符module-info.class文件,将其标记为模块化JAR。图2-6
所有应用程序模块被编译和打包到mods目录并且已经准备好启动了二运行ServiceMonitor在所有模块被编译到mods目录后,终于可以启动应用程序了。如接下来的简要说明所示,这就是模块声明工作的价值所在。要点你需要做的只是调用java,指定模块路径,让java知道从哪里可以找到应用程序所包含的工件,并且告诉它启动哪个模块。而解析所有依赖、避免调用冲突或含混不清的版本,以及用正确的模块启动等工作都是由模块系统处理的。三扩展模块化代码库当然,任何软件项目都不会真正结束(除非项目“死掉”),所以变化是不可避免的。举个例子,如果你想增加另一个observer实现,那么会发生什么呢?通常你会采取以下这些步骤。(1)为其开发子项目。(2)进行构建。(3)在现有代码中使用它。这就是你现在需要做的。对于新模块而言,添加模块声明就能使其融入模块系统。像其他模块一样,对它进行编译和打包。然后将它作为依赖添加到现有代码中。这样就完成了。如果构建包含了编译和打包,你需要做的就只是添加或修改模块声明。删除或重构模块也是如此:除了通常需要做的改动外,还需要稍微思考一下,这将如何影响你的模块图并更新相应的模块声明。四总结:模块系统的效果到目前为止一切都很顺利,不是吗?在后面几章对模块系统的细节进行深入探索之前,先花一些时间来了解模块系统承诺的两个好处,以及利用某些高级特性可以解决哪些边角残留问题。1模块系统能为你做什么前文在讨论模块系统的目标时,谈论了其中最重要的两个目标:可靠配置和强封装。在构建了一些较为具体的东西之后,现在回顾一下这些目标,并且观察一下它们如何帮人们交付健壮并且可维护的软件。01.可靠配置如果一个依赖无法在mods中找到会怎么样?如果两个依赖需要同一个项目(例如Log4j或Guava)的不同版本会怎么样?如果两个模块有意或无意地导出了两个相同的类型会怎么样?在类路径机制下,这些问题会在运行时暴露,其中一些会使应用程序崩溃,另外一些则较为隐蔽,不易被察觉,最终导致错误的程序行为。在模块系统中,许多像这样不可靠的情况(尤其是刚刚提到的这些)会更早被发现。编译器或JVM会终止运行并返回一条具体的提示信息,给人们一个修复错误的机会。例如,当应用程序启动但无法找到monitor.statistics时,你将得到如下提示。类似地,当模块路径中存在两个SLF4J版本时,启动ServiceMonitor应用程序将得到如下结果。你再也不会意外地依赖于某个间接依赖了。Hibernate会使用SLF4J,这意味着应用程序启动时这个库一直存在。但是一旦开始导入SLF4J(没有出现在任何模块声明中)中的类型,编译器就会进行阻止,并提示你正在使用一个没有明确依赖的模块中的代码。即使你想办法绕过了编译器的检查,模块系统也会在启动时执行相同的检查。02.强封装现在让我们从模块使用者的角度切换到模块维护者的角度。想象一下,为了修复一个bug或者改善性能,对monitor.observer.alpha进行重构。在发布一个新版本之后,你发现monitor中的一些代码无法正常工作,这造成了应用程序不稳定。如果你改动了一个公有API,那么这是你的错误。但是,如果你改动了某一类型的内部实现细节,而这个类型虽然被标记为不支持,但仍然被调用了呢?有可能这个类型应该是公有的,因为你想在两个包中使用这个类型;也有可能monitor的开发者通过反射访问了它。在这种情况下,你无法阻止用户依赖于实现。在模块系统的帮助下,这种情况得以避免。事实上你已经做到了:只有被导出的包中的类型才是可见的,其余的都很安全,即使通过反射也无法访问。注意如果万不得已确实需要深入访问某个模块内部。2模块系统还能为你做些什么虽然ServiceMonitor的模块化进行得很顺利,但是仍有一些不足之处值得讨论。目前你对此还无计可施,但是本书第三部分介绍的高级特性可以帮你解决这些问题。本节将预览这些高级特性。01.标记不可或缺的模块依赖monitor.observer.alpha模块和monitor.observer.beta模块声明了对monitor.observer的依赖。这是合理的,因为它们实现了后者暴露的ServiceObserver接口,同时返回了属于同一个模块的DiagnosticDataPoint实例。这在任何使用实现模块的代码上都会导致有趣的结果。包含这两行代码的模块同时也需要依赖monitor.observer,否则它将无法访问ServiceObserver类型和DiagnosticDataPoint类型。如果调用代码没有依赖monitor.observer,整个monitor.observer.alpha模块就会变得毫无意义。只有当调用代码明确依赖于另外一个模块时才可用,这样的模块实在太愚蠢了。幸好有办法!11.1节将介绍隐式可读性(impliedreadability)。02.解耦API的实现和调用思考一下monitor.observer与它的实现模块monitor.observer.alpha和monitor.observer.beta之间的关系,就会发现一些别的问题。为什么monitor必须知道具体实现?就目前而言,monitor需要实例化具体的类,但之后仅与相关的接口进行交互。为了调用一个构造函数而依赖整个模块似乎有些冗余。实际上,在任何时候,要移除一个废弃的ServiceObserver实现或引入一个新的实现,你都不得不更新monitor的模块依赖并且重新编译、打包和部署工件。为了让API的实现和调用方之间实现更松散的耦合,像monitor这样的调用方不需要依赖诸如monitor.observer.alpha和monitor.observer.beta这样的实现,模块系统能够实现这个目标。后文将讨论这个问题。03.让导出更明确还记得那个包含被注释为仅被Hibernate使用的数据传输对象的包吗?持久化模块是如何将它导出的?这看起来不太对——只有Hibernate需要访问这些实体。但现在,其他依赖monitor.persistence的模块,比如monitor,也可以看到它们。你又接触到了一个模块系统的高级特性。合规导出能让某个模块将一个包导出给一些指定的模块,而非所有模块。后面将介绍这个机制。04.使包仅用于反射即便将包仅导出给指定的模块,有时也过于复杂。1)你会基于API[例如Java持久层API(JPA)]编译模块而不是基于具体实现(例如Hibernate),因此需要在合规导出中小心翼翼地提及实现模块。2)你可以使用基于反射的工具(例如Hibernate或Guice)仅在运行时通过反射访问代码,那么为什么要在编译时让其可被访问呢?3)你会依赖于对私有成员的反射(Hibernate在配置字段注入后会这么做),而这在导出包中无法实现。后文呈现了一个解决方案——引入开放式模块和开放式包。这让一些包仅在运行时可用。作为交换,它允许针对私有成员的反射,因为基于反射的工具通常会这么要求。此外还有合格开放,它与导出类似,你可以通过它将某个包仅开放给一些指定的模块。如果曾用过Hibernate作为JPA提供者,那么你也许曾花了很大心思来阻止对Hibernate的直接依赖。这种情况下将某个依赖硬编码到模块声明中绝不会是你想看到的。后面将详细讨论这个场景。3允许可选依赖仅当运行中的应用程序存在某个依赖时,某些代码才会执行,而这种情况并不罕见。比如monitor.statistics模块中可能有一些代码使用了一个时髦的静态类库,而也许是因为许可证的问题,当ServiceMonitor启动时,这个库并非总是存在。另一个例子是具有某些特性的类库,而这些特性仅在某个第三方依赖存在时才会激发用户的兴趣——比如一个测试框架——当某个断言库存在时这个测试框架才会与它协同工作。而根据我们早先讨论的,模块声明中必须声明依赖。这强制规定依赖在编译时必须存在,以方便编译成功。但很不幸,requires关键字意味着依赖在启动时也必须存在,否则JVM会拒绝运行应用程序。这很难令人满意。但正如预期的那样,模块系统为其保留了一条出路,即可选依赖。它在编译时必须存在,在运行时却不是必需的。后文将对此进行讨论。在讨论了所有高级特性之后,后文将展示ServiceMonitor的另外一个实现,其中使用了大部分高级特性。关于定义、构建和运行一个模块化应用程序,后文分别对这3个步骤进行了讲述。它们都很重要,但是接下来的一篇文章尤为重要,因为它讲解了模块系统底层的基本概念和基本原理。五小结1)在将一个应用程序模块化时,可以根据跨越模块边界的类型依赖来推断出模块依赖,这让创建初始的模块依赖关系图变得非常直观。2)多模块项目的目录结构与Java9之前的目录结构相似,所以现有的工具和手段均可以继续工作。3)模块声明——项目根目录中的module-info.java文件是模块系统在代码级别带来的最明显的变化。它为模块命名并声明了依赖和公有API。除此之外,编写代码的方式基本上没有任何变化。4)javac、jar和java命令已经更新以支持模块。最明显的相关变化是模块路径(命令行参数--module-path或-p)。它与类路径具有相同的地位,但为模块服务。【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板
电话+V:159999-78052
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。