package com.example.datacollect; import com.example.datacollect.controller.CrawlerController; import com.example.datacollect.repository.ArticleRepository; import com.example.datacollect.strategy.StrategyFactory; import com.example.datacollect.view.ConsoleView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); // 统一版本标识,与项目迭代版本对齐 private static final String CRAWLER_VERSION = "w11"; public static void main(String[] args) { // 1. 启动时打印环境信息,便于问题排查 logger.info("=== CLI Crawler {} Starting ===", CRAWLER_VERSION); logger.info("Java Version: {}", System.getProperty("java.version")); logger.info("Project Group: com.example, Artifact: datacollect-cli"); // 2. 声明核心组件,便于后续关闭/清理 ConsoleView view = null; CrawlerController controller = null; try { // 初始化核心组件 view = new ConsoleView(); ArticleRepository repository = new ArticleRepository(); StrategyFactory strategyFactory = new StrategyFactory(); controller = new CrawlerController(view, repository, strategyFactory); // 3. 优化欢迎信息,版本号统一 String welcomeMsg = String.format("Welcome to CLI Crawler (%s)! Type 'help' for available commands.", CRAWLER_VERSION); logger.info(welcomeMsg); view.printSuccess(welcomeMsg); // 4. 添加JVM关闭钩子,实现优雅退出(比如Ctrl+C终止时清理资源) Runtime.getRuntime().addShutdownHook(new Thread(() -> { logger.info("=== CLI Crawler {} Shutting Down ===", CRAWLER_VERSION); if (view != null) { view.printInfo("Crawler exited gracefully."); } logger.info("Crawler shutdown completed."); })); // 核心循环:处理用户输入 while (true) { controller.handle(view.readLine()); } } catch (Throwable e) { // 捕获Throwable,覆盖Error和Exception,避免程序意外崩溃 logger.error("Unexpected fatal error in main loop", e); if (view != null) { view.printError("System fatal error: " + e.getMessage()); } System.exit(1); // 非0退出码标识异常 } finally { // 5. 资源清理:关闭ConsoleView中的Scanner(避免资源泄漏) if (view != null) { logger.debug("Closing ConsoleView resources"); // 需给ConsoleView补充close方法(见下方补充说明) view.close(); } logger.info("Main process exited."); } } }