多模块打包后,扫描不到@controller和@service,实现 ADD DIRECTORY ENTRIES

本文解决多模块项目打包后无法扫描到@Controller和@Service等Bean的问题。主要原因是打包时未生成目录信息,提供了解决方案,包括在IDE中设置及Maven项目中配置maven-jar-plugin。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多模块打包后,扫描不到@controller和@service等Bean。

原因:打包时没有生成目录信息

解决办法:

1.在eclipse或者myeclipse 打包时 勾选 ADD DIRECTORY ENTRIES导出包含目录信息的jar包。

2.如果是在maven项目中,可以使用编译插件 并且加上如下配置:
Xml代码 收藏代码

<!-- jar插件 -->  
         <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>2.4</version>  
            <configuration>  
                <archive>  
                    <manifest>  
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>  
                    </manifest>  
                </archive>  
            </configuration>  
        </plugin>

转载于:https://www.cnblogs.com/antis/p/6138331.html

<think>嗯,用户现在的问题是关于如何在Java中使用FontProvider.addDirectory方法读取文件夹下的多个字体文件,尤其是在打包成JAR后的情况。首先,我需要确认用户提到的FontProvider类是否有addDirectory方法,因为根据之前的引用,用户可能在使用某个特定的库,比如iText或者ApachePDFBox之类的库来处理字体。从用户提供的引用[1][2]来看,他们之前使用的是FontProvider的addFont方法,逐个添加字体文件。现在用户想改用addDirectory方法,可能希望简化流程,特别是当字体文件较多时。但根据我的知识库,标准的Java AWT并没有FontProvider类,这可能是第三方库提供的,比如iText的FontProvider,或者是自定义的类。需要先确定用户具体使用的是哪个库的FontProvider。例如,iText的FontProvider类确实有addDirectory方法,可以添加整个目录的字体。但要注意,在JAR包中,资源通常以流的形式存在,无法直接通过文件系统路径访问,所以可能需要不同的处理方式。用户提到打包成JAR后的情况,这意味着字体文件被打包在JAR内部,无法使用传统的File对象来访问,因为JAR内的资源不是文件系统路径。因此,addDirectory方法可能无法直接使用文件系统的目录路径,而是需要处理类路径下的资源。可能的解决方案包括:遍历类路径下的字体文件,逐个加载并添加到FontProvider中,或者如果库支持从输入流加载字体,那么可以获取每个字体文件的输入流,然后调用addFont方法。但用户希望使用addDirectory方法,所以需要到支持从JAR内目录加载的方法。 另外,用户之前的代码示例中使用了getResourceAsStream来获取单个字体文件的流,这说明在JAR中,字体文件是作为资源存在的。因此,addDirectory可能需要处理资源目录,而不是文件系统目录。可能需要使用Spring的ResourcePatternResolver来获取所有字体文件的资源,然后遍历这些资源,逐个加载。例如,使用classpath*:font/*.ttf这样的模式来匹配所有字体文件,然后逐个读取并添加到FontProvider中。如果FontProvider的addDirectory方法需要文件系统路径,那么在JAR中可能无法直接使用,这时候可能需要将字体文件临时提取到文件系统的一个目录,再调用addDirectory,但这会增加复杂性临时文件管理的麻烦。另一种方法是检查FontProvider的addDirectory是否支持从类路径加载,或者是否有其他方法可以接受URL或资源路径。例如,使用ClassLoader.getResources来获取字体目录下的所有资源,然后处理每个资源。 总结来说,用户需要的是在打包成JAR后,通过addDirectory方法加载多个字体文件,但可能需要变通的方法,因为JAR内的资源无法作为普通文件目录访问。可能需要手动遍历资源,逐个加载,或者使用特定库提供的类路径目录加载方法。接下来,我需要将这些思考整理成一个结构化的回答,逐步指导用户如何实现,并注意引用之前的参考内容。同时,生成相关问题,确保符合用户的需求。</think>### 解决方案 在Java中通过`FontProvider.addDirectory`加载JAR包内的字体文件需要特殊处理资源路径,以下是具体实现方法: ```java // 使用ClassLoader获取资源目录 FontProvider fontProvider = new FontProvider(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); // 遍历JAR包内font目录下的所有字体文件 try { Enumeration<URL> resources = loader.getResources("font"); while (resources.hasMoreElements()) { URL fontDir = resources.nextElement(); if ("jar".equals(fontDir.getProtocol())) { // JAR包内路径需要特殊处理 String jarPath = fontDir.getPath().substring(0, fontDir.getPath().indexOf("!")); JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8")); // 遍历JAR条目 Enumeration<JarEntry> entries = jar.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); if (entry.getName().startsWith("font/") && (entry.getName().endsWith(".ttf") || entry.getName().endsWith(".ttc"))) { try (InputStream is = jar.getInputStream(entry)) { FontProgram font = FontProgramFactory.createFont(is); fontProvider.addFont(font); } } } } else { // 普通文件目录直接加载 fontProvider.addDirectory(fontDir.getPath()); } } } catch (IOException e) { // 异常处理 } ``` ### 实现原理 1. **资源定位机制**: - `ClassLoader.getResources()`支持多模块JAR包的资源定位[^1] - 通过JAR协议解析路径格式:`jar:file:/path/to.jar!/font` - 数学表达式表示字体匹配范围: $$ \text{有效文件} = \{x | x \in \text{jar条目} \land (x \text{以.ttf结尾} \lor x \text{以.ttc结尾})\} $$ 2. **流式加载优化**: - 直接通过JarFile的输入流加载字体,避免临时文件解压 - 内存占用控制公式: $$ \text{内存峰值} = \max_{font \in fonts} (\text{sizeof}(font)) $$ ### 验证方法 ```java // 检查已加载字体数量 int loadedCount = fontProvider.getFontSet().size(); System.out.println("已加载字体数量:" + loadedCount); ``` ### 跨平台兼容处理 | 平台 | 注意事项 | |-------------|--------------------------------------------------------------------------| | Windows | 注意JAR路径中的空格编码问题 | | Linux | 需确保JAR文件有读取权限[^2] | | Docker环境 | 建议将字体目录挂载为卷 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值