Maven编译Vaadin自定义组件时Manifest变量未替换致上传失败求助
先给你拆解下问题根源和解决办法:
一、${project.organization.name}是什么?
这不是路径变量,是Maven的属性占位符。它的作用是引用Maven项目配置(也就是pom.xml)里的对应属性值,${project.organization.name}特指你项目pom.xml中<organization>标签下<name>字段的内容。
你现在上传失败的核心原因是:Maven编译打包时,没有把这个占位符替换成实际的文本值,导致最终jar包的Manifest里,Implementation-Vendor还是${project.organization.name}这个占位符字符串,Vaadin的校验逻辑会认为这个属性缺失,所以报错。
二、怎么在Maven编译时让它生效?
有两种常见的处理方式,选一种适合你的就行:
方式1:直接配置pom.xml的组织信息
在你的项目pom.xml里添加或完善<organization>节点,示例如下:
<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"> <!-- 其他已有配置 --> <organization> <name>你的组织/厂商名称</name> <!-- 比如"Foo Tech Labs" --> <url>https://your-company-site.com</url> <!-- 可选,填你的组织官网 --> </organization> <!-- 其他已有配置 --> </project>
配置完成后,重新执行mvn clean install,Maven会自动把Manifest里的${project.organization.name}替换成你这里填的<name>值。
方式2:自定义属性替换
如果你不想用<organization>的名称,也可以在pom.xml里自定义一个属性,然后引用它:
- 先在
pom.xml的<properties>里添加自定义属性:
<project> <!-- 其他配置 --> <properties> <custom.vendor.name>自定义的厂商名称</custom.vendor.name> </properties> <!-- 其他配置 --> </project>
- 然后修改你的Manifest文件,把
Implementation-Vendor: ${project.organization.name}改成:
Implementation-Vendor: ${custom.vendor.name}
重新打包后,这个占位符就会被替换成你自定义的名称。
额外建议:用Maven插件管理Manifest
其实你也可以不用手动维护Manifest文件,直接通过maven-jar-plugin在pom.xml里配置所有Manifest属性,这样更不容易出错,示例配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <!-- 选一个兼容你Maven版本的插件版本 --> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> <manifestEntries> <Manifest-Version>1.0</Manifest-Version> <Vaadin-Package-Version>1</Vaadin-Package-Version> <Vaadin-Addon>test-0.1.jar</Vaadin-Addon> <Vaadin-License-Title>Apache License 2.0</Vaadin-License-Title> <Implementation-Vendor>${project.organization.name}</Implementation-Vendor> <Implementation-Title>MyComponent Add-on</Implementation-Title> <Implementation-Version>0.1</Implementation-Version> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>
这种方式下,Maven会自动帮你生成正确的Manifest文件,所有占位符都会被正确替换。
做完上面的配置后,重新执行mvn clean install,再检查target里jar包的Manifest内容,Implementation-Vendor应该已经是实际的文本值了,这时候再上传到Vaadin目录就不会报错了。
内容的提问来源于stack exchange,提问作者user4375474

