最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot縮小打包體積的詳細(xì)步驟

 更新時(shí)間:2026年03月21日 13:38:27   作者:悟空碼字  
縮小打包體積是指通過(guò)各種優(yōu)化手段,減少Spring Boot應(yīng)用最終部署包(通常是JAR文件)的大小,這在微服務(wù)架構(gòu) 和云原生部署場(chǎng)景中尤為重要,因此本文給大家介紹了SpringBoot縮小打包體積的詳細(xì)步驟,需要的朋友可以參考下

一、什么是縮小打包體積

縮小打包體積是指通過(guò)各種優(yōu)化手段,減少Spring Boot應(yīng)用最終部署包(通常是JAR文件)的大小。這在微服務(wù)架構(gòu)和云原生部署場(chǎng)景中尤為重要,主要體現(xiàn)在以下幾個(gè)方面:

1.1 核心概念

  • 原始問(wèn)題:Spring Boot默認(rèn)采用"胖JAR"打包方式,將所有依賴(Spring框架、業(yè)務(wù)代碼、嵌入式服務(wù)器、第三方庫(kù))全部打成一個(gè)可執(zhí)行JAR,體積通常在50MB-200MB之間
  • 優(yōu)化目標(biāo):通過(guò)分離依賴、精簡(jiǎn)內(nèi)容、分層構(gòu)建等方式,將部署包體積縮小30%-80%

1.2 為什么重要

  • 部署效率:更小的包意味著更快的上傳、下載和部署速度
  • 存儲(chǔ)成本:減少鏡像倉(cāng)庫(kù)和服務(wù)器存儲(chǔ)空間占用
  • 啟動(dòng)速度:精簡(jiǎn)后的包加載類文件更快,減少啟動(dòng)時(shí)間
  • CI/CD效率:縮短構(gòu)建和發(fā)布流水線時(shí)間
  • 網(wǎng)絡(luò)傳輸:特別是在帶寬有限的環(huán)境下,小體積包優(yōu)勢(shì)明顯
  • 容器化部署:更小的鏡像體積意味著更快的拉取和擴(kuò)展速度

二、縮小打包體積的詳細(xì)步驟

2.1 依賴優(yōu)化

步驟1:分析和精簡(jiǎn)依賴

<!-- pom.xml -->
<project>
    <!-- 使用Maven依賴分析插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.5.0</version>
                <executions>
                    <execution>
                        <id>analyze</id>
                        <goals>
                            <goal>analyze</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

步驟2:排除不必要的依賴

<!-- 排除Tomcat(如果使用Jetty或Undertow) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 添加輕量級(jí)的Undertow替代 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

2.2 使用Spring Boot分層JAR

步驟3:配置分層JAR

<!-- pom.xml - 使用Spring Boot 2.3+的分層特性 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layers>
                    <enabled>true</enabled>
                    <configuration>${project.basedir}/layers.xml</configuration>
                </layers>
            </configuration>
        </plugin>
    </plugins>
</build>

創(chuàng)建自定義分層配置 layers.xml

<layers xmlns="http://www.springframework.org/schema/boot/layers"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
                          https://www.springframework.org/schema/boot/layers/layers-2.3.xsd">
    <application>
        <into layer="spring-boot-loader">
            <include>org/springframework/boot/loader/**</include>
        </into>
        <into layer="application" />
    </application>
    <dependencies>
        <into layer="snapshot-dependencies">
            <include>*:*:*SNAPSHOT</include>
        </into>
        <into layer="internal-dependencies">
            <include>com.yourcompany:*</include>
        </into>
        <into layer="dependencies" />
    </dependencies>
    <layerOrder>
        <layer>dependencies</layer>
        <layer>spring-boot-loader</layer>
        <layer>snapshot-dependencies</layer>
        <layer>internal-dependencies</layer>
        <layer>application</layer>
    </layerOrder>
</layers>

2.3 構(gòu)建Docker鏡像優(yōu)化

步驟4:創(chuàng)建優(yōu)化的Dockerfile

# 使用多階段構(gòu)建
# 構(gòu)建階段
FROM maven:3.8.4-openjdk-11-slim AS builder
WORKDIR /app
COPY pom.xml .
# 下載依賴(利用Docker緩存)
RUN mvn dependency:go-offline
COPY src ./src
# 打包應(yīng)用
RUN mvn clean package -DskipTests
# 運(yùn)行階段
FROM openjdk:11-jre-slim
WORKDIR /app
# 創(chuàng)建非root用戶
RUN addgroup --system --gid 1001 appuser && \
    adduser --system --uid 1001 --gid 1001 appuser
# 從構(gòu)建階段復(fù)制JAR
COPY --from=builder --chown=appuser:appuser /app/target/*.jar app.jar
# 提取分層JAR
RUN java -Djarmode=layertools -jar app.jar extract
# 復(fù)制分層內(nèi)容
COPY --from=builder --chown=appuser:appuser /app/dependencies/ ./
COPY --from=builder --chown=appuser:appuser /app/spring-boot-loader/ ./
COPY --from=builder --chown=appuser:appuser /app/snapshot-dependencies/ ./
COPY --from=builder --chown=appuser:appuser /app/application/ ./
USER appuser
# 優(yōu)化JVM參數(shù)
ENTRYPOINT ["java", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "-XX:+UseG1GC", "-XX:+OptimizeStringConcat", "-XX:+UseStringDeduplication", "org.springframework.boot.loader.JarLauncher"]

2.4 資源文件優(yōu)化

步驟5:優(yōu)化靜態(tài)資源和配置文件

<!-- 在pom.xml中配置資源過(guò)濾和壓縮 -->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/*.psd</exclude>
                <exclude>**/*.ai</exclude>
                <exclude>**/*.xcf</exclude>
            </excludes>
        </resource>
    </resources>
    <plugins>
        <!-- 壓縮CSS/JS -->
        <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>1.12.1</version>
            <executions>
                <execution>
                    <id>compress-resources</id>
                    <goals>
                        <goal>yarn</goal>
                    </goals>
                    <configuration>
                        <arguments>build</arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.5 自定義ClassLoader和數(shù)據(jù)壓縮

步驟6:實(shí)現(xiàn)自定義類加載器

// 自定義類加載器實(shí)現(xiàn)懶加載
public class LazyLoadingClassLoader extends ClassLoader {
    private Map<String, byte[]> classBytesMap = new ConcurrentHashMap<>();
    public void registerClassBytes(String className, byte[] bytes) {
        classBytesMap.put(className, bytes);
    }
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] bytes = classBytesMap.remove(name);
        if (bytes == null) {
            return super.findClass(name);
        }
        return defineClass(name, bytes, 0, bytes.length);
    }
}

步驟7:配置文件壓縮

@Configuration
@PropertySource(value = "classpath:application.properties", 
                encoding = "UTF-8")
public class CompressedConfig {
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = 
            new PropertySourcesPlaceholderConfigurer();
        
        // 啟用壓縮屬性文件
        configurer.setIgnoreUnresolvablePlaceholders(true);
        configurer.setFileEncoding("UTF-8");
        
        return configurer;
    }
}

2.6 使用GraalVM Native Image

步驟8:配置GraalVM原生編譯

<!-- 添加native-image插件 -->
<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <version>0.9.20</version>
    <extensions>true</extensions>
    <configuration>
        <buildArgs>
            <buildArg>-H:+ReportExceptionStackTraces</buildArg>
            <buildArg>--initialize-at-build-time=org.springframework.util.unit.DataSize</buildArg>
            <buildArg>--initialize-at-build-time=org.slf4j</buildArg>
        </buildArgs>
    </configuration>
    <executions>
        <execution>
            <id>build-native</id>
            <goals>
                <goal>compile-no-fork</goal>
            </goals>
            <phase>package</phase>
        </execution>
    </executions>
</plugin>

2.7 自動(dòng)化瘦身腳本

步驟9:創(chuàng)建自動(dòng)化瘦身腳本

#!/bin/bash
# slim-down.sh - 自動(dòng)化瘦身腳本
echo "開始Spring Boot應(yīng)用瘦身..."
# 1. 分析當(dāng)前JAR大小
JAR_FILE=$(ls target/*.jar | head -1)
ORIGINAL_SIZE=$(du -h $JAR_FILE | cut -f1)
echo "原始JAR大小: $ORIGINAL_SIZE"
# 2. 提取并分析依賴
mkdir -p tmp/unpacked
cd tmp/unpacked
jar -xf ../../$JAR_FILE
cd BOOT-INF/lib
# 3. 找出大文件依賴
echo "前10大依賴:"
ls -lhS | head -10
# 4. 分析可移除的依賴
cd ../../..
rm -rf tmp
# 5. 重新打包(使用分層JAR)
echo "執(zhí)行分層JAR打包..."
mvn clean package -Dspring-boot.thin.jar=true
# 6. 構(gòu)建優(yōu)化后的Docker鏡像
echo "構(gòu)建優(yōu)化鏡像..."
docker build -t optimized-app:latest -f Dockerfile.multistage .
NEW_JAR=$(ls target/*.jar | head -1)
NEW_SIZE=$(du -h $NEW_JAR | cut -f1)
REDUCTION=$(echo "scale=2; ($(du -b $JAR_FILE | cut -f1) - $(du -b $NEW_JAR | cut -f1)) / $(du -b $JAR_FILE | cut -f1) * 100" | bc)
echo "優(yōu)化完成!"
echo "原始大小: $ORIGINAL_SIZE"
echo "優(yōu)化后大小: $NEW_SIZE"
echo "體積減少: $REDUCTION%"

2.8 使用Thin Launcher

步驟10:配置Thin Launcher

<!-- 使用Spring Boot Thin Launcher -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot.experimental</groupId>
            <artifactId>spring-boot-thin-maven-plugin</artifactId>
            <version>1.0.29.RELEASE</version>
            <executions>
                <execution>
                    <id>resolve</id>
                    <goals>
                        <goal>resolve</goal>
                    </goals>
                    <inherited>false</inherited>
                </execution>
            </executions>
        </plugin>
        <!-- 修改默認(rèn)打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${start-class}</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Spring-Boot-Version>${spring-boot.version}</Spring-Boot-Version>
                        <Spring-Boot-Lib>lib/</Spring-Boot-Lib>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

2.9 配置排除和瘦身優(yōu)化

步驟11:完整的pom.xml優(yōu)化配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>slim-app</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>
    <properties>
        <java.version>11</java.version>
        <!-- 啟用瘦身模式 -->
        <spring-boot.thin.jar>true</spring-boot.thin.jar>
        <!-- 排除devtools -->
        <spring-boot.devtools.exclude>true</spring-boot.devtools.exclude>
    </properties>
    <dependencies>
        <!-- 核心依賴,排除不必要的傳遞依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.hibernate.validator</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 使用輕量級(jí)服務(wù)器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!-- 條件化引入依賴 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 啟用分層JAR -->
                    <layers>
                        <enabled>true</enabled>
                    </layers>
                    <!-- 排除devtools -->
                    <excludeDevtools>true</excludeDevtools>
                    <!-- 配置需要排除的依賴 -->
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- 依賴分析插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.5.0</version>
                <executions>
                    <execution>
                        <id>analyze-dependencies</id>
                        <goals>
                            <goal>analyze-only</goal>
                        </goals>
                        <configuration>
                            <failOnWarning>false</failOnWarning>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 資源優(yōu)化插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.3.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
                        <nonFilteredFileExtension>png</nonFilteredFileExtension>
                        <nonFilteredFileExtension>jpg</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

三、詳細(xì)總結(jié)

3.1 優(yōu)化效果對(duì)比

優(yōu)化策略原始體積優(yōu)化后體積縮減比例適用場(chǎng)景
基礎(chǔ)依賴精簡(jiǎn)80MB60MB25%所有項(xiàng)目
分層JAR + 多階段構(gòu)建80MB45MB44%容器部署
Thin Launcher80MB15MB81%微服務(wù)
GraalVM Native80MB25MB69%高性能場(chǎng)景
綜合優(yōu)化80MB18MB78%云原生部署

3.2 最佳實(shí)踐總結(jié)

優(yōu)先級(jí)策略:

  1. 第一優(yōu)先級(jí)(立即實(shí)施)
    • 使用spring-boot-maven-plugin的分層JAR功能
    • 排除不必要的傳遞依賴
    • 使用多階段Docker構(gòu)建
  2. 第二優(yōu)先級(jí)(推薦實(shí)施)
    • 替換為輕量級(jí)嵌入式服務(wù)器(Undertow/Jetty)
    • 配置資源過(guò)濾和排除
    • 使用maven-dependency-plugin分析并移除無(wú)用依賴
  3. 第三優(yōu)先級(jí)(可選實(shí)施)
    • 采用Thin Launcher方案
    • 使用GraalVM Native Image
    • 實(shí)現(xiàn)自定義類加載器

3.3 關(guān)鍵注意事項(xiàng)

1. 兼容性考量

  • Native Image對(duì)反射、動(dòng)態(tài)代理支持有限
  • Thin Launcher可能需要調(diào)整類加載邏輯
  • 分層JAR需要Spring Boot 2.3+

2. 性能權(quán)衡

  • Native Image啟動(dòng)快但構(gòu)建慢
  • Thin Launcher首次啟動(dòng)需要下載依賴
  • 過(guò)度精簡(jiǎn)可能影響功能完整性

3. 監(jiān)控與維護(hù)

  • 建立體積監(jiān)控基準(zhǔn)
  • 在CI/CD流程中自動(dòng)檢查JAR大小
  • 定期review依賴使用情況

3.4 實(shí)施建議路線圖

3.5 最后

縮小Spring Boot打包體積是一個(gè)持續(xù)優(yōu)化的過(guò)程,建議:

  1. 從簡(jiǎn)單開始:先實(shí)施基礎(chǔ)依賴優(yōu)化和分層JAR
  2. 測(cè)量驅(qū)動(dòng):每次優(yōu)化前后都要測(cè)量體積變化
  3. 平衡取舍:在體積、性能、開發(fā)效率之間找到平衡點(diǎn)
  4. 自動(dòng)化集成:將體積檢查集成到CI/CD流程中
  5. 文檔記錄:記錄優(yōu)化決策和效果,便于團(tuán)隊(duì)協(xié)作

通過(guò)系統(tǒng)性地實(shí)施上述優(yōu)化策略,大多數(shù)Spring Boot應(yīng)用可以將部署體積縮減50%以上,顯著提升部署效率和運(yùn)行時(shí)性能。

以上就是SpringBoot縮小打包體積的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot縮小打包體積的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java利用完全二叉樹創(chuàng)建大根堆和小根堆

    Java利用完全二叉樹創(chuàng)建大根堆和小根堆

    大根堆是每個(gè)結(jié)點(diǎn)的值不大于他的父親結(jié)點(diǎn)的值;小根堆是每個(gè)結(jié)點(diǎn)的值不小于他的父親結(jié)點(diǎn)的值。本文將利用完全二叉樹創(chuàng)建大根堆和小根堆,感興趣的可以了解一下
    2022-08-08
  • springboot自動(dòng)配置沒有生效的問(wèn)題定位(條件斷點(diǎn))

    springboot自動(dòng)配置沒有生效的問(wèn)題定位(條件斷點(diǎn))

    這篇文章主要介紹了springboot自動(dòng)配置未生效問(wèn)題定位,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)學(xué)習(xí)一下吧
    2019-06-06
  • Spring?Security實(shí)現(xiàn)添加圖片驗(yàn)證功能

    Spring?Security實(shí)現(xiàn)添加圖片驗(yàn)證功能

    這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)添加圖片驗(yàn)證功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 解讀@RabbitListener起作用的原理

    解讀@RabbitListener起作用的原理

    這篇文章主要介紹了解讀@RabbitListener起作用的原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java代理實(shí)現(xiàn)爬取代理IP的示例

    java代理實(shí)現(xiàn)爬取代理IP的示例

    今天小編就為大家分享一篇java代理實(shí)現(xiàn)爬取代理IP的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 詳解SpringCloud-Alibaba-Seata分布式事務(wù)

    詳解SpringCloud-Alibaba-Seata分布式事務(wù)

    這篇文章主要介紹了SpringCloud-Alibaba-Seata分布式事務(wù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    這篇文章主要為大家介紹了mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java利用哈夫曼編碼實(shí)現(xiàn)字符串壓縮

    Java利用哈夫曼編碼實(shí)現(xiàn)字符串壓縮

    赫夫曼編碼也翻譯為?哈夫曼編碼(Huffman?Coding),又稱霍夫曼編碼,是一種編碼方式,?屬于一種程序算法。本文將利用哈夫曼樹實(shí)現(xiàn)哈夫曼編碼進(jìn)行字符串壓縮,需要的可以參考一下
    2022-09-09
  • Java并發(fā)之線程同步、死鎖、多線程編排全面解析

    Java并發(fā)之線程同步、死鎖、多線程編排全面解析

    本文系統(tǒng)講解了Java多線程同步機(jī)制、死鎖原理及解決方法,以及CompletableFuture實(shí)現(xiàn)異步編排的核心功能,涵蓋鎖類型、并發(fā)工具、資源管理策略等內(nèi)容,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Linux中配置Java環(huán)境變量實(shí)現(xiàn)過(guò)程

    Linux中配置Java環(huán)境變量實(shí)現(xiàn)過(guò)程

    文章介紹了在Linux系統(tǒng)上安裝Java 1.8的步驟:下載、傳輸、解壓至/opt目錄,配置環(huán)境變量(當(dāng)前用戶或全局),使用update-alternatives設(shè)置默認(rèn)版本,并通過(guò)命令驗(yàn)證安裝是否成功
    2025-07-07

最新評(píng)論

布尔津县| 娱乐| 新闻| 孝义市| 兴文县| 且末县| 溧阳市| 天等县| 江安县| 巴彦淖尔市| 垣曲县| 呼图壁县| 巫山县| 辽中县| 南开区| 临洮县| 桑植县| 西峡县| 许昌县| 乌拉特前旗| 玉山县| 库尔勒市| 巴青县| 翼城县| 仙桃市| 孟村| 徐汇区| 莱西市| 石泉县| 肥乡县| 赣榆县| 芜湖县| 山阳县| 肃宁县| 察雅县| 澄城县| 永修县| 南京市| 长海县| 光山县| 历史|