如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
以下是详细步骤:
1. 创建项目
1.1 打开 IntelliJ IDEA。
1.2 在启动界面,点击 Create New Project(创建新项目)。
1.3 选择 Java,然后点击 Next。
1.4 确保 Project SDK 选择了正确的 JDK 版本(例如 JDK 1.8 或更高版本)。
1.5 点击 Next,然后为项目命名(例如 TextSeekServer)。
1.6 点击 Finish 完成项目创建。
2. 创建包和类
2.1 在 src 目录下,右键点击 New > Package,创建包 com.myth。
2.2 在 com.myth 包中,右键点击 New > Java Class,分别创建以下类:
AESUtil.java
DBUtil.java
TextSeekServer.java(包含 main 函数)
3. 创建配置文件
3.1 在 项目视图 中,找到项目的根目录(例如 TextSeekServer),右键点击 New > Directory,创建目录 resources。
3.2 在 resources 目录中,右键点击 New > File,分别创建以下文件:
config.properties
dbconfig.properties
maintenance.properties
log4j2.xml
3.3 将 resources 目录标记为资源目录
右键点击 resources 目录 > 选择 Mark Directory as > Resources Root
4. 添加 MariaDB JDBC 驱动
4.1 下载 mariadb-java-client-3.1.4.jar:
从 MariaDB JDBC Driver 官方下载页面 下载。
https://mariadb.com/kb/en/about-mariadb-connector-j/
4.2 将下载的 JAR 文件放到项目的 lib 目录中:
在项目根目录下,右键点击 New > Directory,创建目录 lib。
将 mariadb-java-client-3.1.4.jar 复制到 lib 目录中。
4.3 将 JAR 文件添加到项目的类路径:
右键点击 mariadb-java-client-3.1.4.jar,选择 Add as Library。
在弹出的对话框中:
Level:选择 Module Library(推荐)或 Global Library
Add to Module:选择当前模块(例如 TextSeekServer)
点击 OK
4.4 验证 lib 目录的状态
4.4.1 打开 Project Structure(项目结构):
进入 File > Project Structure。
4.4.2 在 Modules 选项卡中:
选择当前模块(例如 TextSeekServer)。
切换到 Dependencies 选项卡。
确认 mariadb-java-client-3.1.4.jar 已添加到模块的依赖列表中。
4.4.3 在 Libraries 选项卡中:
确认 mariadb-java-client-3.1.4.jar 已作为库添加到项目中
4.4.4 备注 lib 目录本身不需要被标记为 Sources Root 或
Resources Root,因为它只是存放 JAR 文件的目录。
它的作用是通过 Add as Library 将 JAR 文件添加到项目的类路径中
5. 配置项目结构
5.1 进入 File > Project Structure(项目结构)。
5.2 在 Modules 选项卡中,确保 src 目录被标记为 Sources,resources 目录被标记为 Resources。
5.3 在 Libraries 选项卡中,确认 mariadb-java-client-3.1.4.jar 已添加。
6. 配置文件内容
config.properties
# 示例配置
app.name=TextSeekServer
app.version=1.0
dbconfig.properties
# 数据库配置
db.url=jdbc:mariadb://localhost:3306/testdb
db.user=root
db.password=123456
maintenance.properties
# 维护配置
maintenance.mode=false
maintenance.message=System is under maintenance.
log4j2.xml
<Configuration status="WARN">
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 文件输出 -->
<RollingFile name="File" fileName="logs/textseek-server.log"
filePattern="logs/textseek-server-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<!-- 每天生成一个新文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 文件大小超过10MB时生成新文件 -->
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<!-- 最多保留7个日志文件 -->
<DefaultRolloverStrategy max="7"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- 根日志记录器 -->
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
<!-- 针对TextSeekServer的日志记录器 -->
<Logger name="com.myth.TextSeekServer" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Logger>
</Loggers>
</Configuration>
根据log4j2.xml 配置文件,日志文件将输出到 logs/textseek-server.log,并且会根据日期和文件大小进行滚动归档。为了确保日志能够正确输出,你需要创建 logs 目录,并确保程序有权限写入该目录
a. 创建 logs 目录
在项目根目录下,右键点击 New > Directory,创建 logs 目录。
目录路径:TextSeekServer/logs/。
确保 logs 目录位于项目的根目录下,而不是 src 或 resources 目录中。
b. 确保 logs 目录的权限
如果你在 Windows 系统上运行程序,确保程序有权限写入 logs 目录。
如果你在Linux或macOS系统上运行程序,确保logs目录的权限允许程序写入:
chmod 755 logs
c. 日志配置文件的路径
在 log4j2.xml 中,日志文件的路径是相对路径:
<RollingFile name="File" fileName="logs/textseek-server.log"
filePattern="logs/textseek-server-%d{yyyy-MM-dd}-%i.log">
这意味着日志文件将输出到项目根目录下的 logs 目录中。
d. 运行程序并验证日志输出
运行程序后,检查 logs 目录是否生成了日志文件:
主日志文件:textseek-server.log。
滚动归档文件:textseek-server-{日期}-{序号}.log。
如果日志文件未生成,检查以下内容:
确保 logs 目录存在且路径正确。
确保程序有权限写入 logs 目录。
检查 log4j2.xml 配置文件是否正确加载
e. 日志配置文件的内容
你提供的 log4j2.xml 配置文件内容是正确的,以下是关键点说明:
控制台输出:日志会输出到控制台。
文件输出:日志会输出到 logs/textseek-server.log,并且每天或文件大小超过 10MB 时会滚动归档。
日志级别:
根日志记录器的级别是 info。
com.myth.TextSeekServer 的日志级别是 debug
如果在Linux或macOS系统上你希望日志文件输出到其他目录,可以修改 fileName 和 filePattern 的路径。例如:
fileName="/var/logs/textseek-server.log"
filePattern="/var/logs/textseek-server-%d{yyyy-MM-dd}-%i.log"
7. 命令行程序转换为 Swing 项目
如果要将此命令行程序转换为 Swing 项目,只需在 TextSeekServer.java 中创建一个 Swing 窗口,并将逻辑移到 Swing 事件监听器中。例如
TextSeekServer.java(Swing 版本)
package com.myth;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
public class TextSeekServer {
private static final Logger logger = LogManager.getLogger(TextSeekServer.class);
public static void main(String[] args) {
JFrame frame = new JFrame("TextSeekServer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
JButton button = new JButton("Test");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
// 测试 AESUtil
String encrypted = AESUtil.encrypt("Hello, World!");
String decrypted = AESUtil.decrypt(encrypted);
logger.info("Encrypted: " + encrypted);
logger.info("Decrypted: " + decrypted);
// 测试 DBUtil
Connection conn = DBUtil.getConnection();
logger.info("Database connection established: " + conn);
DBUtil.closeConnection();
} catch (Exception ex) {
logger.error("Error occurred: ", ex);
}
}
});
frame.getContentPane().add(button);
frame.setVisible(true);
}
}
8. 项目结构示例
完成上述步骤后,项目结构应如下所示:
TextSeekServer/
├── src/
│ └── com/
│ └── myth/
│ ├── AESUtil.java
│ ├── DBUtil.java
│ └── TextSeekServer.java
├── resources/
│ ├── config.properties
│ ├── dbconfig.properties
│ ├── maintenance.properties
│ └── log4j2.xml
├── lib/
│ ├── log4j-api-2.20.0.jar
│ ├── log4j-core-2.20.0.jar
│ └── mariadb-java-client-3.1.4.jar
└── logs/
9. 验证目录结构
9.1 打开 Project Structure(项目结构):
进入 File > Project Structure。
9.2 在 Modules 选项卡中,确保:
src 目录被标记为 Sources (非常重要)。
resources 目录被标记为 Resources(非常重要)。
9.3 在 Libraries 选项卡中,确认 mariadb-java-client-3.1.4.jar 已添加。
10. 运行程序
在 TextSeekServer.java 中编写 main 方法。
右键点击 TextSeekServer.java,选择 Run 'TextSeekServer.main()'。
11. 将 Java 项目编译成可执行的 JAR 包,可以通过以下步骤完成。我们将使用
IntelliJ IDEA 的内置功能来打包项目,并确保所有依赖项(如
mariadb-java-client-3.1.4.jar)和配置文件(如 log4j2.xml 和
*.properties)都包含在 JAR 包中。
步骤 1:配置项目结构
a)确保项目结构正确:
src 目录包含源代码。
resources 目录包含配置文件(如 log4j2.xml 和 *.properties)。
lib 目录包含第三方 JAR 文件(如 mariadb-java-client-3.1.4.jar)。
b)在 Project Structure 中,确保 resources 目录被标记为 Resources Root:
进入 File > Project Structure > Modules。
选择 src 目录,确保它被标记为 Sources。
选择 resources 目录,确保它被标记为 Resources。
步骤 2:创建 JAR 包的 Artifact
a)进入 File > Project Structure > Artifacts。
b)点击 + 按钮,选择 JAR > From modules with dependencies。
c)在弹出的对话框中:
Module:选择你的模块(例如 TextSeekServer)。
Main Class:选择包含 main 方法的类(例如 com.myth.TextSeekServer)。
点击 OK。
d)在 Artifacts 选项卡中,确保以下内容:
Output Layout 中包含了 src 目录的编译输出(.class 文件)。
resources 目录的内容被包含在 JAR 包的根目录中。
lib 目录中的 JAR 文件被包含在 JAR 包的 lib 目录中。
e)点击 Apply 和 OK 保存配置。
步骤 3:构建 JAR 包
a)进入 Build > Build Artifacts。(如果菜单 Build Artifacts 为灰色 表示缺少步骤 2)
b)选择你刚刚创建的 Artifact(例如 TextSeekServer:jar),然后点击 Build。
c)IntelliJ IDEA 会生成 JAR 包,并将其输出到 out/artifacts/TextSeekServer_jar/ 目录中。
步骤 4:验证 JAR 包
a)打开生成的 JAR 包(例如 TextSeekServer.jar),检查以下内容:
确保 com/myth/ 目录中包含编译后的 .class 文件。
确保 log4j2.xml 和 *.properties 文件位于 JAR 包的根目录中。
确保 lib/mariadb-java-client-3.1.4.jar 文件位于 JAR 包的 lib 目录中。
b)如果发现缺少文件,可以手动编辑 Artifacts 配置,确保所有需要的文件和依赖项都被包含。
步骤 5:运行 JAR 包
打开终端或命令提示符。
导航到 JAR 包所在的目录:cd out/artifacts/TextSeekServer_jar
运行 JAR 包:java -jar TextSeekServer.jar
步骤 6:处理依赖项
如果你的 JAR 包依赖外部 JAR 文件(如 mariadb-java-client-3.1.4.jar),可以通过以下方式处理:
方式 1:将依赖项打包到 JAR 包中
在 Artifacts 配置中,确保所有依赖项都被包含在 JAR 包的 lib 目录中。
在 MANIFEST.MF 中指定类路径:
打开 Artifacts 配置,点击 Create Manifest 按钮,生成 MANIFEST.MF 文件。
在 MANIFEST.MF 中添加 Class-Path 条目,例如:
Class-Path: lib/mariadb-java-client-3.1.4.jar
方式 2:使用外部依赖项
将依赖项 JAR 文件放在一个单独的目录中(例如 lib)。
运行 JAR 包时,通过 -cp 参数指定类路径:
java -cp TextSeekServer.jar:lib/* com.myth.TextSeekServer
步骤 7:打包为可执行 JAR(包含所有依赖项)
如果你希望将所有依赖项打包到一个可执行的 JAR 文件中,可以使用 Fat JAR 或 Uber JAR 的方式:
a)在 Artifacts 配置中,选择 Extract to the target JAR,将所有依赖项解压并合并到主 JAR 文件中。
b)重新构建 JAR 包。
项目结构示例
打包后的 JAR 包结构如下:
TextSeekServer.jar
├── com/
│ └── myth/
│ ├── AESUtil.class
│ ├── DBUtil.class
│ └── TextSeekServer.class
├── log4j2.xml
├── config.properties
├── dbconfig.properties
├── maintenance.properties
├── lib/
│ ├── log4j-api-2.20.0.jar
│ ├── log4j-core-2.20.0.jar
│ └── mariadb-java-client-3.1.4.jar
└── logs/
如果程序在运行时无法找到 *.properties 文件,例如
[main] ERROR com.myth.TextSeekServer - Error loading conf
ig file: config.properties (系统找不到指定的文件。)
java.io.FileNotFoundException: config.properties (系统找不到指定的文件。)
以下是解决这个问题的详细步骤:
1. 确保配置文件被打包到 JAR 文件中
1.1 打开生成的 JAR 文件(例如 TextSeekServer.jar),检查以下内容:
确保 config.properties、dbconfig.properties、maintenance.properties 和 log4j2.xml 文件位于 JAR 包的根目录中。
如果这些文件缺失,说明它们在打包时没有被正确包含。
1.2 在 IntelliJ IDEA 中,确保 resources 目录被标记为 Resources Root:
进入 File > Project Structure > Modules。
选择 resources 目录,确保它被标记为 Resources。
1.3 在 Artifacts 配置中,确保 resources 目录的内容被包含在 JAR 包的根目录中:
进入 File > Project Structure > Artifacts。
选择你的 Artifact(例如 TextSeekServer:jar)。
在 Output Layout 中,确保 resources 目录的内容被包含。
1.4 重新构建 JAR 包:
进入 Build > Build Artifacts。
选择你的 Artifact,然后点击 Rebuild。
2. 确保程序正确加载配置文件
在 Java 程序中,加载资源文件(如 config.properties)时,应该使用 ClassLoader 来从类路径中加载文件,而不是直接使用文件路径。
修改代码以从类路径加载配置文件
例如,在 DBUtil.java 中,修改加载配置文件的代码:
import java.io.InputStream;
import java.util.Properties;
public class DBUtil {
private static Connection connection;
public static Connection getConnection() throws SQLException {
if (connection == null || connection.isClosed()) {
Properties props = new Properties();
try (InputStream input = DBUtil.class.getClassLoader().getResourceAsStream("dbconfig.properties")) {
if (input == null) {
throw new FileNotFoundException("dbconfig.properties not found in classpath");
}
props.load(input);
} catch (IOException e) {
throw new RuntimeException("Error loading dbconfig.properties", e);
}
String url = props.getProperty("db.url");
String user = props.getProperty("db.user");
String password = props.getProperty("db.password");
connection = DriverManager.getConnection(url, user, password);
}
return connection;
}
public static void closeConnection() throws SQLException {
if (connection != null && !connection.isClosed()) {
connection.close();
}
}
}
修改 TextSeekServer.java 中的日志配置加载方式
如果 log4j2.xml 也需要从类路径加载,确保 Log4j2 配置文件的加载方式正确:
import org.apache.logging.log4j.core.config.Configurator;
public class TextSeekServer {
private static final Logger logger = LogManager.getLogger(TextSeekServer.class);
public static void main(String[] args) {
// 从类路径加载 log4j2.xml
Configurator.initialize(null, "classpath:log4j2.xml");
logger.info("Starting TextSeekServer...");
try {
// 测试 AESUtil
String encrypted = AESUtil.encrypt("Hello, World!");
String decrypted = AESUtil.decrypt(encrypted);
logger.info("Encrypted: " + encrypted);
logger.info("Decrypted: " + decrypted);
// 测试 DBUtil
Connection conn = DBUtil.getConnection();
logger.info("Database connection established: " + conn);
DBUtil.closeConnection();
} catch (Exception e) {
logger.error("Error occurred: ", e);
}
}
}
3. 验证配置文件是否在 JAR 包中
3.1 打开生成的 JAR 文件(例如 TextSeekServer.jar),检查以下文件是否存在于根目录:
config.properties
dbconfig.properties
maintenance.properties
log4j2.xml
3.2 如果文件缺失,重新检查 Artifacts 配置,确保 resources 目录的内容被包含。
问题 1:配置文件仍然找不到
确保 resources 目录被标记为 Resources Root。
确保 resources 目录的内容被包含在 JAR 包的根目录中。
确保程序使用 ClassLoader 从类路径加载文件。
问题 2:日志配置文件未生效
确保 log4j2.xml 文件位于 JAR 包的根目录中。
确保程序使用 Configurator.initialize(null, "classpath:log4j2.xml"); 加载日志配置文件。
=====================================================================
如果你希望 resources 目录下的配置文件(如 config.properties、dbconfig.properties 等)可以在运行 JAR 包之前由用户修改,而不是将这些文件打包到 JAR 包中,可以通过以下方式实现:
1. 将配置文件放在 JAR 包外部
将配置文件放在 JAR 包外部的某个目录中(例如与 JAR 包同一目录下的 config 目录),并在程序中动态加载这些文件。
2. 修改项目结构
2.1 在项目根目录下创建一个 config 目录,用于存放配置文件:
TextSeekServer/
├── config/
│ ├── config.properties
│ ├── dbconfig.properties
│ ├── maintenance.properties
│ └── log4j2.xml
├── src/
│ └── com/
│ └── myth/
│ ├── AESUtil.java
│ ├── DBUtil.java
│ └── TextSeekServer.java
├── lib/
│ ├── log4j-api-2.20.0.jar
│ ├── log4j-core-2.20.0.jar
│ └── mariadb-java-client-3.1.4.jar
├── logs/
│
└── out/
└── artifacts/
└── TextSeekServer_jar/
└── TextSeekServer.jar
2.2 将 resources 目录中的配置文件移动到 config 目录中。
3. 修改代码以加载外部配置文件
在程序中,使用文件的绝对路径或相对路径来加载外部的配置文件。
示例代码:加载外部配置文件
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class DBUtil {
private static Connection connection;
public static Connection getConnection() throws SQLException {
if (connection == null || connection.isClosed()) {
Properties props = new Properties();
try (InputStream input = new FileInputStream("config/dbconfig.properties")) {
props.load(input);
} catch (IOException e) {
throw new RuntimeException("Error loading dbconfig.properties", e);
}
String url = props.getProperty("db.url");
String user = props.getProperty("db.user");
String password = props.getProperty("db.password");
connection = DriverManager.getConnection(url, user, password);
}
return connection;
}
public static void closeConnection() throws SQLException {
if (connection != null && !connection.isClosed()) {
connection.close();
}
}
}
加载外部日志配置文件
如果 log4j2.xml 也需要从外部加载,可以在程序启动时指定配置文件路径:
import org.apache.logging.log4j.core.config.Configurator;
public class TextSeekServer {
private static final Logger logger = LogManager.getLogger(TextSeekServer.class);
public static void main(String[] args) {
// 从外部加载 log4j2.xml
Configurator.initialize(null, "config/log4j2.xml");
logger.info("Starting TextSeekServer...");
try {
// 测试 AESUtil
String encrypted = AESUtil.encrypt("Hello, World!");
String decrypted = AESUtil.decrypt(encrypted);
logger.info("Encrypted: " + encrypted);
logger.info("Decrypted: " + decrypted);
// 测试 DBUtil
Connection conn = DBUtil.getConnection();
logger.info("Database connection established: " + conn);
DBUtil.closeConnection();
} catch (Exception e) {
logger.error("Error occurred: ", e);
}
}
}
4. 打包 JAR 文件
4.1 在 IntelliJ IDEA 中,确保 resources 目录不再包含配置文件。
4.2 进入 File > Project Structure > Artifacts,确保配置文件中没有包含 config 目录。
4.3 重新构建 JAR 包:
进入 Build > Build Artifacts。
选择你的 Artifact,然后点击 Rebuild。
5. 运行 JAR 包
5.1 将生成的 JAR 文件和 config 目录放在同一目录下:
your-deployment-folder/
├── config/
│ ├── config.properties
│ ├── dbconfig.properties
│ ├── maintenance.properties
│ └── log4j2.xml
├── lib/
│ ├── log4j-api-2.20.0.jar
│ ├── log4j-core-2.20.0.jar
│ └── mariadb-java-client-3.1.4.jar
├── logs/
│
└── TextSeekServer.jar
5.2 打开终端或命令提示符,导航到 JAR 包所在的目录:
cd your-deployment-folder
5.3 运行 JAR 包:
java -jar TextSeekServer.jar
6. 允许用户修改配置文件
用户可以在运行 JAR 包之前,直接编辑 config 目录中的配置文件(如 config.properties、dbconfig.properties 等),程序会动态加载这些文件。
7. 注意事项
确保 config 目录中的配置文件路径与代码中的路径一致。
如果配置文件路径需要灵活配置,可以通过命令行参数或环境变量指定配置文件路径。例如:
java -Dconfig.path=/path/to/config -jar TextSeekServer.jar
然后在代码中读取 config.path 系统属性:
String configPath = System.getProperty("config.path", "config");
String dbConfigPath = configPath + "/dbconfig.properties";
相关文章:
如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
以下是详细步骤: 1. 创建项目 1.1 打开 IntelliJ IDEA。 1.2 在启动界面,点击 Create New Project(创建新项目)。 1.3 选择 Java,然后点击 Next。 1.4 确保 Project SDK 选择了正确的 JDK 版本&#x…...
Linux红帽:RHCSA认证知识讲解(十 一)配置NTP 时间同步、用户密码策略与使用 autofs 实现 NFS 自动挂载
Linux红帽:RHCSA认证知识讲解(十 一)配置NTP 时间同步、用户密码策略与 NFS 自动挂载 前言一、配置 NTP 时间同步1.1 NTP 简介1.2 安装和配置 NTP 客户端 二、配置新建用户密码过期时间2.1 查看用户密码过期时间2.2 修改密码过期时间 三、使用…...
ffmpeg音视频处理流程
文章目录 FFmpeg 音视频处理流程详细讲解总结音视频处理流程相关的 FFmpeg 工具和命令 FFmpeg 的音视频处理流程涵盖了从输入文件读取数据、编码和解码操作、数据处理、以及最终输出数据的完整过程。为了更好地理解这一流程,我们可以从以下几个关键步骤来分析&#…...
leetcode-代码随想录-链表-移除链表元素
题目 链接:203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 输入:head [1,2,6,3,4,5,6], val 6 …...
c++与rust的语言区别,rust的主要难点,并举一些例子
C 和 Rust 都是系统级编程语言,它们在设计目标、语法、内存管理等方面存在诸多区别,以下为你详细介绍: 设计目标 C:C 最初是为了给 C 语言添加面向对象编程特性而设计的,之后不断发展,旨在提供高性能、灵…...
从基础算力协作到超智融合,超算互联网助力大语言模型研习
一、背景 大语言模型(LLMs)的快速发展释放出了AI应用领域的巨大潜力。同时,大语言模型作为 AI领域的新兴且关键的技术进展,为 AI 带来了全新的发展方向和应用场景,给 AI 注入了新潜力,这体现在大语言模型独…...
【spring cloud Netflix】Eureka注册中心
1.概念 Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的 需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。同时,服务提供方与Eureka之间通过“心跳” 机制进行监控…...
记录学习的第二十天
今天只做了一道题,有点不在状态。 这道题其实跟昨天的每日一题是差不多的,不过这道题需要进行优化。 根据i小于j,且j小于k,当nums[j]确定时,保证另外两个最大即可得答案。 所以可以使用前缀最大值和后缀最大值。 代…...
7-5 表格输出
作者 乔林 单位 清华大学 本题要求编写程序,按照规定格式输出表格。 输入格式: 本题目没有输入。 输出格式: 要求严格按照给出的格式输出下列表格: ------------------------------------ Province Area(km2) Pop.(…...
【爬虫开发】爬虫开发从0到1全知识教程第14篇:scrapy爬虫框架,介绍【附代码文档】
本教程的知识点为:爬虫概要 爬虫基础 爬虫概述 知识点: 1. 爬虫的概念 requests模块 requests模块 知识点: 1. requests模块介绍 1.1 requests模块的作用: 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点:…...
安装 Microsoft Visual C++ Build Tools
Microsoft Visual C Build Tools下载安装 安装Microsoft Visual C Build Tools是为了在windows系统上编译和运行需要C支持的程序或库(例如某些Python包,Node.js模块等)。 1.下载 打开浏览器,访问 Visual Studio Build Tools下载…...
启服云专利管理系统:铸就知识产权保护的坚固壁垒
在全球竞争日益激烈的今天,知识产权已经成为企业核心竞争力的关键组成部分,而专利作为知识产权的重要体现,其管理和保护显得尤为重要。启服云专利管理系统凭借其卓越的功能和先进的技术,在知识产权保护领域展现出了显著的优势。 高…...
树莓派 5 部署 OMV(OpenMediaVault)
我使用Raspberry Pi OS Lite【Debian version: 12 (bookworm)】搭建OMV 换源,换源教程请参考:树莓派 5 换源 加入omv国内清华源 # 创建openmediavault.list文件 touch /etc/apt/sources.list.d/openmediavault.list # 加入内容 echo "deb [signed…...
Opencv之dilib库:表情识别
一、简介 在计算机视觉领域,表情识别是一个既有趣又具有挑战性的任务。它在人机交互、情感分析、安防监控等众多领域都有着广泛的应用前景。本文将详细介绍如何使用 Python 中的 OpenCV 库和 Dlib 库来实现一个简单的实时表情识别系统。 二、实现原理 表情识别系统…...
吾爱置顶软件,吊打电脑自带功能!
今天我给大家带来一款超棒的软件,它来自吾爱论坛的精选推荐,每一款都经过精心挑选,绝对好用! S_Clock 桌面计时软件 这款软件的界面设计特别漂亮,简洁又大方。它是一款功能齐全的时钟计时倒计时软件,既能正…...
深入理解浏览器的事件循环
浏览器的进程模型 浏览器进程:负责子进程的管理和用户交互网络进程:负责加载网络资源渲染进程:浏览器会为每一个标签页开启一个新的渲染进程。 渲染进程中的渲染主线程是我们最关注的,因为浏览器的事件循环就发生在这之中渲染主进…...
分布式锁之redis6
一、分布式锁介绍 之前我们都是使用本地锁(synchronize、lock等)来避免共享资源并发操作导致数据问题,这种是锁在当前进程内。 那么在集群部署下,对于多个节点,我们要使用分布式锁来避免共享资源并发操作导致数据问题…...
数据框的添加
在地图制图中,地图全图显示的同时希望也能够显示局部放大图,以方便查看地物空间位置的同时,也能查看地物具体的相对位置。例如,在一个名为airport的数据集全图制图过程中,希望能附上机场区域范围的局部地图,…...
SQL Server 2022 读写分离问题整合
跟着热点整理一下遇到过的SQL Server的问题,这篇来聊聊读写分离遇到的和听说过的问题。 一、读写分离实现方法 1. 原生高可用方案 1.1 Always On 可用性组(推荐方案) 配置步骤: -- 1. 启用Always On功能 USE [master] GO ALT…...
启服云云端专利管理系统:解锁专利管理新境界
在当今竞争激烈的商业环境中,专利作为企业的核心资产,其管理的重要性不言而喻。启服云云端专利管理系统以其卓越的性能和独特的优势,成为企业专利管理的得力助手,为企业的创新发展保驾护航。 便捷高效,突破时空限制 启…...
记录一下零零散散的的东西-ImageNet
ImageNet 是一个非常著名的大型图像识别数据集, 数据集基本信息 内容说明📸 图像数量超过 1400万张图片(包含各类子集)🏷️ 类别数量常用的是 ImageNet-1K(1000类)🧑Ἶ…...
全连接RNN反向传播梯度计算
全连接RNN反向传播梯度计算 RNN数学表达式BPTT(随时间的反向传播算法)参数关系网络图L对V的梯度L对U的梯度L对W和b的梯度 RNN数学表达式 BPTT(随时间的反向传播算法) 参数关系网络图 L对V的梯度 L对U的梯度 L对W和b的梯度...
基于BusyBox构建ISO镜像
1. 准备 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建议:系统内核<3.10.0 使用busybox < 1.33.2版本 2. 安装busybox # 安装依赖 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下载 wget https://…...
使用python完成手写数字识别
入门图像识别的第一个案例,看到好多小伙伴分享,也把自己当初的思路捋捋,写成一篇博客,作为记录和分享,也欢迎各位交流讨论。 实现思路 数据集:MNIST(包含60,000个训练样本和10,000个测试样本) 深度学习框架:Keras(基于TensorFlow) 模型架构:卷积神经网络(CNN) 实…...
Vue2 过滤器 Filters
提示:Vue 过滤器是用于格式化文本的 JavaScript 函数,通过管道符 | 在模板中使用 文章目录 前言过滤器的核心特性1. 链式调用2. 参数传递3. 纯函数特性 过滤器的常见使用场景1. 文本格式化2. 数字处理3. 日期/时间格式化4. 样式控制(结合组件…...
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
c++中cin.ignore()的作用
在 C 中,cin.ignore() 是用于忽略(丢弃)输入流中的字符的函数,通常用来清除输入缓冲区中的残留内容(如换行符、多余输入等),以避免影响后续的输入操作。 基本用法 cin.ignore(n, delim);n&…...
讲一下resblock的跳跃连接,以及连接前后的shape保持(通过padding保持shape不变)
ResNet 残差块(ResBlock)的跳跃连接 & 形状保持 ResNet(Residual Network)通过 残差块(Residual Block, ResBlock) 解决了深度网络的梯度消失问题。其核心是跳跃连接(Skip Connection&…...
Unity中优化绘制调用整理
DrawCall 指的是 CPU 向 GPU 发送渲染指令的过程,在 Unity 中,每次渲染一个网格时,CPU 都需要向 GPU 发送一系列的渲染指令,这个过程被称为一次绘制调用(Draw Call)。 1.GPU实例化 使用: 2.绘…...
Coco-AI 支持嵌入,让你的网站拥有 AI 搜索力
在之前的实践中,我们已经成功地把 Hexo、Hugo 等静态博客和 Coco-AI 检索系统打通了:只要完成向量化索引,就可以通过客户端问答界面实现基于内容的智能检索。 这一层已经很好用了,但总觉得少了点什么—— 比如用户还得专门打开一…...
深入解析Java哈希表:从理论到实践
哈希表(Hash Table)是计算机科学中最重要的数据结构之一,也是Java集合框架的核心组件。本文将以HashMap为切入点,深入剖析Java哈希表的实现原理、使用技巧和底层机制。 一、哈希表基础原理 1. 核心概念 键值对存储:通…...
leetcode76.最小覆盖子串
思路源于 【小白都能听懂的算法课】【力扣】【LeetCode 76】最小覆盖子串|滑动窗口|字符串 初始化先创建t的哈希表记录t中的字符以及它出现的次数,t的have记录t中有几种字符 s的哈希表记录窗口中涵盖t的字符以及它出现的次数,初始…...
【HTB】Windwos-easy-Legacy靶机渗透
靶机介绍,一台很简单的WIndows靶机入门 知识点 msfconsole利用 SMB历史漏洞利用 WIndows命令使用,type查看命令 目录标题 一、信息收集二、边界突破三、权限提升 一、信息收集 靶机ip:10.10.10.4攻击机ip:10.10.16.26 扫描TC…...
一问讲透redis持久化机制-rdb aof
一问讲透redis持久化机制-rdb aof 文章目录 一问讲透redis持久化机制-rdb aof前言一、RDB二、AOF二、原理 前言 提示:这里可以添加本文要记录的大概内容: redis作为内存数据库,常常作为系统的缓存使用,但是内存是断电清空数据的…...
【大模型基础_毛玉仁】6.4 生成增强
目录 6.4 生成增强6.4.1 何时增强1)外部观测法2)内部观测法 6.4.2 何处增强6.4.3 多次增强6.4.4 降本增效1)去除冗余文本2)复用计算结果 6.4 生成增强 检索器得到相关信息后,将其传递给大语言模型以期增强模型的生成能…...
4.1-泛型编程深入指南
4.1 泛型编程深入指南 本节将带您深入探索C#泛型机制在游戏开发中的高级应用。通过游戏对象池、数据管理器、事件系统等实际案例,您将学习如何运用泛型构建高效、灵活的游戏系统。掌握这些知识将帮助您开发出性能更好、架构更清晰的游戏。 前置知识 在学习本节内容…...
《K230 从熟悉到...》识别机器码(AprilTag)
《K230 从熟悉到...》识别机器码(aprirltag) tag id 《庐山派 K230 从熟悉到...》 识别机器码(AprilTag) AprilTag是一种基于二维码的视觉标记系统,最早是由麻省理工学院(MIT)在2008年开发的。A…...
操作系统(二):实时系统介绍与实例分析
目录 一.概念 1.1 分类 1.2 主要指标 二.实现原理 三.主流实时系统对比 一.概念 实时系统(Real-Time System, RTS)是一类以时间确定性为核心目标的计算机系统,其设计需确保在严格的时间约束内完成任务响应。 1.1 分类 根据时间约束的严…...
虚拟电商-话费充值业务(六)话费充值业务回调补偿
一、话费充值回调业务补偿 业务需求:供应商对接下单成功后充吧系统将订单状态更改为:等待确认中,此时等待供应商系统进行回调,当供应商系统回调时说明供应商充值成功,供应商回调充吧系统将充吧的订单改为充值成功&…...
加密解密工具箱 - 专业的在线加密解密工具
加密解密工具箱 - 专业的在线加密解密工具 您可以通过以下地址访问该工具: https://toolxq.com/static/hub/secret/index.html 工具简介 加密解密工具箱是一个功能强大的在线加密解密工具,支持多种主流加密算法,包括 Base64、AES、RSA、DES…...
印度股票实时数据API接口选型指南:iTick.org如何成为开发者优选
在全球金融数字化浪潮中,印度股票市场因其高速增长潜力备受关注。对于量化交易开发者、金融科技公司而言,稳定可靠的股票报价API接口是获取市场数据的核心基础设施。本文将深度对比主流印度股票API,并揭示iTick在数据服务领域的独特优势。 一…...
使用python实现视频播放器(支持拖动播放位置跳转)
使用python实现视频播放器(支持拖动播放位置跳转) Python实现视频播放器,在我早期的博文中介绍或作为资料记录过 Python实现视频播放器 https://blog.csdn.net/cnds123/article/details/145926189 Python实现本地视频/音频播放器https://bl…...
Python星球日记 - 第2天:数据类型与变量
🌟引言: 上一篇:Python星球日记 - 第1天:欢迎来到Python星球 名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和…...
CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景
CyclicBarrier、Semaphore 和 CountDownLatch 是 Java 并发包中用于线程协作的工具类,它们虽然都与线程同步相关,但设计目的和使用场景有显著差异。以下是它们的核心区别和典型应用场景: 1. CountDownLatch 核心机制 一次性计数器…...
【愚公系列】《高效使用DeepSeek》050-外汇交易辅助
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
java短连接,长连接
在网络通信中,短连接(Short Connection)是指客户端与服务器建立连接后,仅完成一次或几次数据交互就立即断开连接的通信方式。以下是关于短链接的详细说明: 一、短链接的核心特点 连接短暂 数据传输完成后立即关闭连接…...
从零开始训练Codebook:基于ViT的图像重建实践
完整代码在文末,可以一键运行。 1. 核心原理 Codebook是一种离散表征学习方法,其核心思想是将连续特征空间映射到离散的码本空间。我们的实现方案包含三个关键组件: 1.1 ViT编码器 class ViTEncoder(nn.Module):def __init__(self, codebo…...
每日一题洛谷P8664 [蓝桥杯 2018 省 A] 付账问题c++
P8664 [蓝桥杯 2018 省 A] 付账问题 - 洛谷 (luogu.com.cn) 思路:要使方差小,那么钱不能一下付的太多,可以让钱少的全付玩,剩下还需要的钱再让钱多的付(把钱少的补上)。 将钱排序,遍历一遍&…...
蓝桥杯真题——传送阵
原题连接:蓝桥杯2024年第十五届省赛真题-传送阵 - C语言网 知识点:并查集 题目描述 小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了 n 个传送阵,进入第 i 个传送阵会被传送到第 ai 个传送阵前,并且可以随时选择…...
解释回溯算法,如何应用回溯算法解决组合优化问题?
一、回溯算法核心原理 回溯算法本质是暴力穷举的优化版本,采用"试错剪枝"策略解决问题。其核心流程如下: 路径构建:记录当前选择路径选择列表:确定可用候选元素终止条件:确定递归结束时机剪枝优化…...