Template error, template file not found

Material 符号指南

什么是 Material Symbol?Material Symbols 是我们最新的图标,将 2,500 多个字形整合到一个具有各种设计变体的字体文件中。符号提供三种样式和四个可调整的可变字体轴(填充、粗细、坡度和光学尺寸)。请参阅 Materia...
继续阅读 »

什么是 Material Symbol?

Material Symbols 是我们最新的图标,将 2,500 多个字形整合到一个具有各种设计变体的字体文件中。符号提供三种样式和四个可调整的可变字体轴(填充、粗细、坡度和光学尺寸)。请参阅 Material Symbols 库中的全套 Material 符号。

FILL 轴

Fill 可让您修改默认的图标样式。单个图标可以同时呈现广告空缺和填充状态。

如需传达状态转换,请使用填充轴进行动画或互动。默认值为 0(默认值),值为 1(完全填充)。除了粗细轴外,填充也会影响图标的外观。

wght 轴

Weight 用于定义符号的笔触粗细,粗细范围介于窄字体 (100) 和粗体 (700) 之间。权重也会影响符号的总体大小。

GRAD 轴

坡度轴可视化

重量和等级会影响符号的粗细。对等级的调整比对权重的调整更为精细,并且对符号的尺寸影响较小。

对于某些文本字体,您还可以使用成绩。您可以匹配文本和符号的层级,以实现和谐的视觉效果。例如,如果文本字体的等级值为 -25,符号可以将其与合适的值(例如 -25)匹配。

您可以根据不同的需求使用成绩:

低强调度(例如 -25 等级):如需减少深色背景上浅色符号的眩光,请使用低等级。

高强调度(例如 200 等级):如需突出显示某个符号,请增加正等级。

opsz 轴

光学尺寸范围为 20dp 到 48dp。

为了让图片在不同尺寸下看起来相同,描边粗细(粗细)会随着图标大小的缩放而发生变化。光学尺寸提供了一种方式,可在您增大或缩小符号尺寸时自动调整描边粗细。

获取 Material 符号

Material Symbol 有多种格式,适用于不同类型的项目和平台,既适合应用开发者,也适合设计模型或原型的设计人员。

许可

Material Symbols 按 Apache 许可版本 2.0 提供。

浏览和下载单个图标

您可以从 Material Symbols 库获得 SVG 或 PNG 格式的一整套 Material 符号。它们适用于 Web、Android 和 iOS,或与任何设计工具搭配使用。

Git 代码库

git 代码库中包含一组 SVG 格式的完整 Material 符号。

$ git clone https://github.com/google/material-design-icons

使用 Material Symbol

在 Web 中使用

Material Symbols 字体是将 Material Symbols 整合到 Web 项目中的最简单方法。

系统会将这些图标打包为一种字体,以便 Web 开发者只需几行代码即可轻松整合这些图标。

使用 Google Fonts 的静态字体

如需设置在任何网页中使用的图标字体,最简单的方法是使用 Google Fonts。添加下面一行 HTML 代码:

<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet" />

上面的代码段包含每个的默认配置,权重为 400,光学尺寸为 48,等级为 0,填充为 0。

使用 Fonts CSS API 配置不同的轴值。请参考以下示例:

 

Google Fonts 的可变字体

如果您要通过 CSS 为图标添加动画效果,或者想要更精细地控制图标功能,请使用 Google Symbols 可变字体。使用范围(采用 number..number 格式)时,我们可以加载整个可变字体。请查看 Can I Use 的变量字体支持,了解您的用户能否加载可变字体(最有可能)。下面是一些示例:


甚至还能为它们添加动画效果!


自行托管字体

图标字体托管在您控制的位置,以决定何时更新资源。例如,如果网址为 https://example.com/material-symbols.woff,请添加以下 CSS 规则:

@font-face {
  font-family: 'Material Symbols Outlined';
  font-style: normal;
  src: url(https://example.com/material-symbols.woff) format('woff');
}



要正确渲染字体,请声明渲染图标的 CSS 规则。这些规则通常作为 Google Fonts API 样式表的一部分提供,但在自托管时需要手动添加到您的项目中:

.material-symbols-outlined {
  font-family: 'Material Symbols Outlined';
  font-weight: normal;
  font-style: normal;
  font-size: 24px;  /* Preferred icon size */
  display: inline-block;
  line-height: 1;
  text-transform: none;
  letter-spacing: normal;
  word-wrap: normal;
  white-space: nowrap;
  direction: ltr;
}

在 HTML 中使用图标

上面提供的示例使用了一种名为连字的排版功能,这样一来,只需使用其文本名称即可呈现图标字形。网络浏览器会自动将文本连字替换为图标矢量,并提供与等效的数字字符引用相比更易于阅读的代码。例如,在 HTML 中,您将使用 arrow_forward 来表示图标,而不是 &#xE5C8;。对于其他图标,请使用图标名称的蛇形命名法(即用下划线替换空格)。

桌面设备和移动设备上的大多数现代浏览器都支持此功能。请参阅“Can I Uses 连字支持”,了解您的用户是否能够处理连字(最有可能)。

如果您确实需要支持不支持连词的浏览器,请使用数字字符引用(也称为代码点)指定图标,如下例所示:


选择任意图标并打开图标字体面板,即可找到 Material Symbols 库中的图标名称和代码点。每种图标字体在 Google Fonts git 代码库中都有一个代码点索引,用于显示完整的名称和字符代码。

在 Material Design 中设置图标样式

这些图标的设计遵循 Material Design 准则,使用建议的图标大小和颜色时效果最佳。以下样式可让您轻松应用我们建议的尺寸、颜色和活动状态。


在 Android 中使用

在 Material Symbols 库中,所有图标都采用矢量可绘制对象格式。如需了解详情,请参阅 Android Vector Asset Studio 文档

在 iOS 中使用

这些图标也以 Apple Symbols 格式提供。如需详细了解这些符号,请参阅官方 Apple Symbols 概览使用指南

在 Flutter 中使用

我们计划让 Flutter 支持 Material Symbol。敬请关注最新动态。


收起阅读 »

非常便宜的国内服务器域名自动过白

idc
一个月的:    核心骨干网络,傲盾、金盾集群提供安全防护    4核    4G    10M带宽...
继续阅读 »

一个月的:

    核心骨干网络,傲盾、金盾集群提供安全防护

    4核    4G    10M带宽    40G磁盘 12元/1月

    8核    8G    20M带宽    80G磁盘 18元/1月


一年的:

    4核    4 G    10M带宽   40G磁盘 339元/1年

两年的:

    核心骨干网络,傲盾、金盾集群提供安全防护

    4核    4G    10M带宽    20G磁盘 770元/2年

    6核    6G    12M带宽    40G磁盘 950元/2年

    8核8    G    15M带宽    80G磁盘 1160元/2年


三年的:

    核心骨干网络,傲盾、金盾集群提供安全防护

    4核    4G    30M带宽    40G磁盘 1290元/3年

    8核    8G    50M带宽    80G磁盘 1960元/3年

    16核  16G  100M带宽  120G磁盘 2990元/3年


五年的:

    核心骨干网络,傲盾、金盾集群提供安全防护

    4核    4G    50M带宽    50G磁盘 2080元/5年

    8核    8G    80M带宽    100G磁盘 3080元/5年

    16核 16G 120M带宽    160G磁盘 4280元/5年


购买地址:https://www.dwidc.com



收起阅读 »

结合别人的API做了个生成好看的手写体的功能

其实也没不算练字儿,就是你输入你想要写的文字,给你生成一个很好看的手写体。包括英文。反正我是觉得挺好看的。网址:http://sanshu.cn/page/lianzi/ API用的 https://api.cenguigui.cn/ 他们...
继续阅读 »

其实也没不算练字儿,就是你输入你想要写的文字,给你生成一个很好看的手写体。包括英文。

image.png

反正我是觉得挺好看的。

网址:http://sanshu.cn/page/lianzi/


API用的 https://api.cenguigui.cn/ 他们家的。好玩的还挺多


收起阅读 »

红警尤里的复仇免安装无毒无广告版下载

 盟军结局 靠着爱因斯坦的时空传送仪,盟军击破莫斯科,而罗曼诺夫被谭雅抓获,送往伦敦 审判。接续的是《红色警戒2:尤里的复仇》。   苏联结局 尤里为夺权,谋杀了罗曼诺夫和维拉迪摩将军,后来被苏军情报员截获罗曼诺夫生 前的录映带,后期故事围绕着“为总...
继续阅读 »

image.png

 盟军结局 靠着爱因斯坦的时空传送仪,盟军击破莫斯科,而罗曼诺夫被谭雅抓获,送往伦敦 审判。接续的是《红色警戒2:尤里的复仇》。   

苏联结局 尤里为夺权,谋杀了罗曼诺夫和维拉迪摩将军,后来被苏军情报员截获罗曼诺夫生 前的录映带,后期故事围绕着“为总理报仇”的主旋律,后来,玩家控制的指挥官 成功统一全世界,并发展航天事业。结局最后,尤里的大脑狂吼“我会复仇 的!”,揭开了《尤里的复仇》的序幕。

下载地址:

 https://pan.baidu.com/s/13I2g4AYE12Dw2VF7vunaRQ?pwd=wej1


收起阅读 »

vue在线表单设计器

这是一个功能超级强大的vue表单设计器,支持vue2,vue3代码生成,您只需要拖拉拽就可以生成相应的代码,也支持pad和手机端的预览。网址:http://vue.devtools.cn/
继续阅读 »

这是一个功能超级强大的vue表单设计器,支持vue2,vue3代码生成,您只需要拖拉拽就可以生成相应的代码,也支持pad和手机端的预览。

网址:http://vue.devtools.cn/

image.png

收起阅读 »

docker-compose里的links和bridge的关系

在新版的Docker和docker-compose中,links功能没有被bridge网络直接取代,但是Docker引入了更加强大和灵活的网络功能,尤其是自定义网络,这使得links变得不那么必要了。让我们澄清这两者之间的区别和进展。Docker网络和brid...
继续阅读 »

image.png

在新版的Docker和docker-compose中,links功能没有被bridge网络直接取代,但是Docker引入了更加强大和灵活的网络功能,尤其是自定义网络,这使得links变得不那么必要了。让我们澄清这两者之间的区别和进展。

Docker网络和bridge

  • 默认的bridge网络:在Docker中,每个安装默认都会创建一个名为bridge的网络。如果不显式为容器指定网络,容器就会连接到这个默认的bridge网络。这个网络允许容器间通信,但它不提供DNS解析服务,这意味着容器不能仅通过服务名来互相发现和通信。

  • 自定义网络:Docker允许用户创建自定义网络(比如使用docker network create命令)。自定义网络(通常是bridge类型)提供了内置的DNS解析,使得容器可以通过服务名(或容器名)相互发现和通信。这大大简化了容器间通信的配置。

docker-compose和网络

在使用docker-compose时,可以为服务定义使用哪个网络。如果没有指定网络,docker-compose会为同一个docker-compose.yml文件中定义的所有服务创建一个默认的网络,这个网络允许服务间通过服务名称进行DNS解析和通信,从而无需links。

迁移和最佳实践

  • 过去:在早期版本中,links被用来解决容器间通信的问题,它允许容器通过别名相互访问,但不提供DNS服务。

  • 现在:随着Docker网络的成熟,特别是自定义网络带来的内置DNS支持,建议使用网络来处理容器间的通信。这提供了更好的灵活性和扩展性,同时也更加符合Docker的使用惯例。

总结,虽然links在技术上没有被任何单一的特性“取代”,但Docker的进步意味着使用自定义网络和服务发现的方式比依赖links更加现代、灵活和推荐。


收起阅读 »

Java返回指定索引的泛型参数

有的时候我们需要获取泛型的指定索引的参数,就可以使用下面的代码。/**  * <p>  * 反射对象获取泛型  * </p>  *  * @par...
继续阅读 »

有的时候我们需要获取泛型的指定索引的参数,就可以使用下面的代码。

/**
 * <p>
 * 反射对象获取泛型
 * </p>
 *
 * @param clazz 对象
 * @param index 泛型所在位置
 * @return Class
 */
public static Class<?> getSuperClassGenericType(final Class<?> clazz, final int index) {
    Type genType = clazz.getGenericSuperclass();
    if (!(genType instanceof ParameterizedType)) {
        logger.warn(String.format("Warn: %s's superclass not ParameterizedType", clazz.getSimpleName()));
        return Object.class;
    }
    Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
    if (index >= params.length || index < 0) {
        logger.warn(String.format("Warn: Index: %s, Size of %s's Parameterized Type: %s .", index,
                clazz.getSimpleName(), params.length));
        return Object.class;
    }
    if (!(params[index] instanceof Class)) {
        logger.warn(String.format("Warn: %s not set the actual class on superclass generic parameter",
                clazz.getSimpleName()));
        return Object.class;
    }
    return (Class<?>) params[index];
}


使用方法:

public abstract class CrudServiceImpl<M extends BaseMapper<T>, T, D> extends BaseServiceImpl<M, T> implements CrudService<T, D> {

    protected Class<D> currentDtoClass() {
        return (Class<D>)ReflectionKit.getSuperClassGenericType(getClass(), 2);
    }
}


这样操作就可以获取到当前类的第三个泛型参数了。


收起阅读 »

关于shiro和Spring Security

You解释下:@RequiresPermissions 的用法 和注意事项ChatGPT@RequiresPermissions 是一个来自 Apache Shiro 安全框架的注解,用于 Java 应用程序中。Apache Shiro 是一个强大且易于使用的...
继续阅读 »


You

解释下:@RequiresPermissions 的用法 和注意事项

ChatGPT

@RequiresPermissions 是一个来自 Apache Shiro 安全框架的注解,用于 Java 应用程序中。Apache Shiro 是一个强大且易于使用的安全框架,提供了身份验证、授权、密码学和会话管理等功能。@RequiresPermissions 注解主要用于方法级别的权限控制,确保只有拥有特定权限的用户才能调用被注解的方法。

用法

@RequiresPermissions 注解可以直接添加到你想要进行权限控制的方法上。它接受一个字符串数组作为参数,数组中的每个字符串代表一个权限。用户需要拥有注解中定义的所有权限才能执行该方法。

import org.apache.shiro.authz.annotation.RequiresPermissions;
public class SomeService {    
        @RequiresPermissions("user:edit")
    public void editUser(User user) {        // 方法实现
    }
}

在上面的例子中,editUser 方法被 @RequiresPermissions 注解修饰,只有当用户拥有 user:edit 权限时,才能调用此方法。

注意事项

  1. 权限字符串的格式:权限字符串通常遵循 "域:操作" 的格式,这有助于维护清晰的权限结构,但实际格式取决于你的应用需求。

  2. 异常处理:如果用户尝试调用他们没有权限执行的方法,Shiro 默认会抛出 UnauthorizedException。确保你的应用能够恰当地处理这些异常,例如通过全局异常处理器返回友好的错误信息给用户。

  3. 配置依赖和集成:使用 @RequiresPermissions 之前,确保已经正确配置并集成了 Apache Shiro 到你的应用程序中。这包括配置 Shiro 的安全管理器、Realm 和其他相关的安全策略。

  4. 性能考虑:权限检查可能会涉及到对数据库或缓存的查询。确保这些操作被合理地优化,以避免对应用程序性能造成不利影响。

  5. 精细权限控制:在设计权限模型时,要注意精细度。过于精细的权限控制可能会使权限管理变得复杂和困难,而过于粗略则可能无法满足安全要求。

  6. 安全注解和编程式安全:虽然使用注解是一种便捷的权限控制方式,但在某些情况下,可能需要通过编程式安全来动态控制访问权限。了解何时使用注解以及何时需要编程式控制是很重要的。

正确使用 @RequiresPermissions 注解可以有效地增强应用程序的安全性,但也需要确保整个安全架构合理设计,以满足应用的安全需求。


You

如何和spring security 结合起来用呢


ChatGPT

将 Apache Shiro 的 @RequiresPermissions 注解与 Spring Security 结合使用并不是一种直接的集成路径,因为 Apache Shiro 和 Spring Security 是两个独立的安全框架,它们各自提供了不同的安全解决方案。通常,一个应用会选择其中一个框架来实现安全需求,而不是尝试将它们混合使用。

如果你正在使用 Spring Security:

如果你的应用已经在使用 Spring Security,你可以通过 Spring Security 的权限控制注解来实现类似 @RequiresPermissions 的功能。Spring Security 提供了 @PreAuthorize、@PostAuthorize、@Secured 等注解,可以用于方法级的安全控制。

使用 @PreAuthorize

@PreAuthorize 注解可以在方法调用之前进行权限验证,类似于 Shiro 的 @RequiresPermissions。这里是一个使用 @PreAuthorize 的例子:

import org.springframework.security.access.prepost.PreAuthorize;
public class SomeService {    
        @PreAuthorize("hasAuthority('user:edit')")
    public void editUser(User user) {        // 方法实现
    }
}

在这个例子中,只有当用户拥有 user:edit 权限时,才能调用 editUser 方法。

集成 Shiro 和 Spring Security:

如果你确实需要同时使用 Shiro 和 Spring Security,可能是因为应用中有特定的需求,需要从两个框架中各自获取功能,这种情况下,你可以考虑以下方法:

  1. 分离安全域:可以将应用中的不同安全需求分离开来,让 Shiro 和 Spring Security 分别管理不同的安全域。例如,使用 Shiro 来处理权限基于细粒度的访问控制,而使用 Spring Security 处理基于角色的访问控制、OAuth2 集成等。

  2. 自定义集成:在更复杂的场景下,你可能需要自定义一些组件,使得 Shiro 和 Spring Security 能够在同一个应用中协同工作。这可能包括编写


You

两者优缺点呢?

ChatGPT

ChatGPT

Apache Shiro 和 Spring Security 都是优秀的安全框架,它们提供了一套丰富的安全特性,包括认证、授权、会话管理、加密等。它们各自有不同的设计哲学和使用场景,因此各有优缺点。下面是两者的简要比较:

Apache Shiro

优点

  1. 简单易用:Shiro 设计初衷是易于理解和实现,提供了直观的API和配置方式,使得开发者可以快速上手和实现安全需求。

  2. 灵活性:Shiro 提供了简单的认证和授权,以及会话管理、加密等功能。它可以轻松地被集成到各种应用中,不仅限于 Web 应用。

  3. 轻量级:Shiro 在设计上更为轻量级,不会引入太多依赖,适合需要精简安全框架的项目。

缺点

  1. 社区和资源:与 Spring Security 相比,Shiro 的社区相对较小,可用的资源、文档和第三方集成也不如 Spring Security 丰富。

  2. 企业级特性:虽然 Shiro 为大多数应用提供了强大的安全支持,但在一些高度复杂的安全需求和企业级特性方面,可能不如 Spring Security 强大。

Spring Security

优点

  1. 全面的安全解决方案:Spring Security 提供了一套非常全面的安全特性,包括但不限于认证、授权、防止跨站请求伪造、会话固定保护、安全通道(HTTPS)等。

  2. 扩展性和灵活性:Spring Security 提供了高度的可配置性和扩展性,可以通过扩展现有组件或添加自定义逻辑来满足复杂的安全需求。

  3. 强大的社区和生态:作为 Spring 生态系统的一部分,Spring Security 拥有庞大的社区支持和丰富的学习资源。此外,与其他 Spring 项目(如 Spring Boot)的集成非常紧密,提供了无缝的开发体验。

缺点

  1. 学习曲线:由于其功能丰富和灵活性高,新手可能会发现 Spring Security 的学习曲线比较陡峭,尤其是在处理复杂的安全需求时。

  2. 配置复杂性:虽然提供了丰富的配置选项,但正确配置 Spring Security 以满足特定需求可能会比较繁琐,特别是在没有深入理解框架的情况下。

总结

选择哪一个框架取决于你的具体需求、项目规模、团队熟悉度以及与其他技术栈的集成需求。对于需要快速上手且项目相对简单的场景,Apache Shiro 是一个不错的选择。而对于需要更全面安全特性、更高灵活性和更强大社区支持的复杂应用,Spring Security 可能是更合适的选择。


You

说说 Spring Security 提供的高度的可配置性和扩展性,可以通过扩展现有组件或添加自定义逻辑来满足复杂的安全需求。

ChatGPT

ChatGPT

Spring Security 提供了非常高的可配置性和扩展性,使得开发者可以通过扩展现有组件或添加自定义逻辑来满足复杂的安全需求。这一特性是通过多种机制实现的,包括自定义过滤器、自定义用户详情服务、自定义入口点、权限评估、方法安全等。以下是一些关键的扩展和自定义机制:

自定义用户认证

  • 自定义用户详情服务(UserDetailsService):可以通过实现 UserDetailsService 接口来自定义用户的加载逻辑。这对于从非标准数据源(如数据库、LDAP等)加载用户详情非常有用。

  • 自定义认证提供者(AuthenticationProvider):如果需要更多控制认证过程,可以实现 AuthenticationProvider 接口。这允许开发者自定义认证逻辑,包括密码验证、多因素认证等。

自定义访问控制

  • 自定义投票策略(Access Decision Voters):Spring Security 支持基于投票的访问决策。开发者可以实现自己的 AccessDecisionVoter 来定义如何评估用户的请求是否应被授权。

  • 方法级安全:通过使用 @PreAuthorize、@PostAuthorize、@Secured 等注解,开发者可以在方法级别进行细粒度的权限控制。这些注解支持使用 Spring EL 表达式进行复杂的逻辑判断。

自定义过滤器

  • 自定义过滤器(Filters):Spring Security 的安全机制大量依赖于 Servlet 过滤器。开发者可以添加自定义过滤器来执行诸如请求日志记录、请求验证、CORS 设置等自定义逻辑。

  • 过滤器链定制:可以通过调整过滤器链中的过滤器顺序或添加新的过滤器来调整请求处理流程,这对于添加如 API 令牌支持等自定义功能非常重要。

自定义登录和注销行为

  • 自定义认证入口点(AuthenticationEntryPoint):用于定制认证过程的起点,如自定义登录页面或返回特定的错误响应给未认证的请求。

  • 自定义成功/失败处理器:可以自定义认证成功或失败后的处理逻辑,例如,重定向到不同页面或返回特定格式的响应。

自定义会话管理

  • 会话固定保护:Spring Security 提供了会话固定保护策略的配置选项,可以通过自定义配置来增强应用的安全性。

  • 并发会话控制:可以配置并发会话控制,限制用户的并发登录数,或在用户达到会话数量限制时采取特定行动。

这些扩展点提供了在不改变框架核心逻辑的情况下定制和扩展 Spring Security 的能力。开发者可以根据具体需求灵活选择适合的扩展点进行定制,从而实现复杂的安全需求。这种高度的可配置性和扩展性是 Spring Security 成为企业级应用首选安全框架的重要原因之一。


You

Shiro 除了 RequiresPermissions  还有哪些方法

ChatGPT

Apache Shiro 提供了一系列注解用于控制访问权限和会话管理,这些注解使得在代码级别上实现安全控制变得简单而直接。除了 @RequiresPermissions,Shiro 还提供了以下一些常用的安全注解:

认证控制注解

  • @RequiresAuthentication:确保当前 Subject(主体)已经通过认证,即在当前的 session 中是已经登录状态。

  • @RequiresUser:确保当前 Subject 是已知的用户,被认证或被记住(通过“Remember Me”服务)都可以。

授权控制注解

  • @RequiresRoles:要求当前 Subject 拥有所有指定的角色才能访问或调用被注解的类/实例/方法。如果 Subject 没有指定的角色之一,则方法不会被执行。

    @RequiresRoles("admin")
    public void someAdminMethod() {    
    // 需要管理员角色才能访问的代码}}


  • @RequiresPermissions:如前所述,这个注解要求当前 Subject 拥有所有指定的权限才能访问或调用被注解的类/实例/方法。

会话控制注解

  • @RequiresGuest:要求当前 Subject 是一个“访客”,即他们在当前的 session 中没有被认证或被记住。

  • @RequiresSession:确保当前 Subject 有一个 session,无论他们是否被认证。

示例

@RequiresRoles({"admin", "manager"})
public void updateProfile(User user) {    // 这个方法要求当前用户必须同时拥有 admin 和 manager 角色}

在这个示例中,updateProfile 方法被 @RequiresRoles 注解修饰,意味着只有拥有 admin 和 manager 角色的用户才能调用此方法。

注意事项

使用这些注解时需要注意的是,Shiro 的注解处理是通过 AOP (面向切面编程) 实现的。因此,要确保你的应用已经正确配置了 AOP 支持(例如,在 Spring 应用中通过 Spring AOP 或使用其他 AOP 框架)。此外,当使用这些注解时,如果访问被拒绝,Shiro 默认会抛出相应的异常(如 UnauthorizedException 或 UnauthenticatedException),需要在应用中适当处理这些异常。


收起阅读 »

spring里使用静态方法获取HttpServeltRequest

public static HttpServletRequest getHttpServletRequest() {     return ((ServletReques...
继续阅读 »
public static HttpServletRequest getHttpServletRequest() {
    return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}


收起阅读 »

maven 使用 wagon-maven-plugin 自动编译并发布jar到服务器

pom文件里追加下面的操作可以自动发布:<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>wagon-maven-plugin</art...
继续阅读 »

pom文件里追加下面的操作可以自动发布:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<fromFile>target/${pack-name}</fromFile>
<url><![CDATA[scp://${remote-username}:${remote-passwd}@${remote-addr}${service-path}]]></url>
<commands>
<!-- Kill Old Process -->
<command>kill -9 `ps -ef |grep ${project.artifactId}.jar|grep -v "grep" |awk '{print $2}'`</command>
<!-- Restart jar package,write result into renren.log -->
<command><![CDATA[nohup java -jar ${service-path}/${pack-name} --spring.profiles.active=test > ${service-path}/sanshu.log 2>&1 & ]]></command>
<command><![CDATA[netstat -nptl]]></command>
<command><![CDATA[ps -ef | grep java | grep -v grep]]></command>
</commands>
<!-- 运行命令 mvn clean package wagon:upload-single wagon:sshexec-->
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>


代码解释如下:

这段POM (Project Object Model) 代码配置了一个 Maven 插件,wagon-maven-plugin,用于在 Maven 构建过程中执行远程操作,例如上传文件和执行远程服务器上的命令。以下是详细解释:

  • groupId & artifactId: 这些元素指定了插件的 Maven 坐标。对于此段代码,它指定了 wagon-maven-plugin,一个由 org.codehaus.mojo 组提供的 Maven 插件。

  • version: 插件版本号为 1.0。

  • configuration: 配置部分详细指定了插件的运行配置。

    • 第一个命令用于杀死旧的进程,通过查找包含项目的 artifactId 在其命令行中的 Java 进程。

    • 第二个命令重启 jar 包,并将输出重定向到一个日志文件中。

    • 第三个和第四个命令分别用于检查网络端口的监听状态和查找运行中的 Java 进程。

    • fromFile: 指定了要上传的文件。这里使用了 Maven 属性 ${pack-name} 来动态指定文件名。这意味着你可以在 Maven 的配置文件中指定 pack-name 的值,它将被解析并用于替换这个占位符。

    • url: 指定了文件上传的目标 URL。这里使用了 scp 协议(安全复制协议),并且动态插入了多个 Maven 属性,包括远程服务器的用户名、密码、地址以及服务路径。这些都被包含在 CDATA 区域内,允许包含特殊字符而不被 XML 解析器处理。

    • commands: 定义了一系列在远程服务器上执行的命令。

    • displayCommandOutputs: 设置为 true,意味着插件会显示每个执行命令的输出。

  • 运行命令: 注释中提到的命令 mvn clean package wagon:upload-single wagon:sshexec 说明了如何使用这个插件。clean package 会清理旧的构建并创建一个新的包,wagon:upload-single 会上传这个包到配置的远程位置,而 wagon:sshexec 会在远程服务器上执行配置的命令序列。

总之,这段代码配置的 Maven 插件提供了一种机制,通过它,开发者可以在构建过程中自动化地上传文件到远程服务器,并在服务器上执行一系列预定义的命令,例如重启应用程序。这种自动化可以显著提高部署效率,特别是在持续集成/持续部署(CI/CD)流程中。


收起阅读 »
1234>>>