简体   繁体   English

如何从源代码正确构建keycloak

[英]How to properly build keycloak from source code

I need to build a custom version of Keycloak in order to perform another action when password reset happens.我需要构建一个自定义版本的 Keycloak,以便在发生密码重置时执行另一个操作。 In order to do this, I followed the steps described in the Readme file on the git repository:为此,我按照 git 存储库上的自述文件中描述的步骤进行了操作:

  1. Check java version, maven version, git version (openjdk 11, amazon corretto, maven 3.6.3)检查 java 版本、maven 版本、git 版本(openjdk 11、amazon corretto、maven 3.6.3)
  2. Run "git clone https://github.com/keycloak/keycloak.git "运行“git clone https://github.com/keycloak/keycloak.git
  3. Switch to the newly created directory切换到新创建的目录
  4. Run "mvn install"运行“mvn安装”

Some tests failed in module keycloak-saml-core:模块 keycloak-saml-core 中的一些测试失败:

org.keycloak.saml.processing.core.parsers.saml.SAMLParserTest
[ERROR] testSaml20AuthnResponseNonAsciiNameDefaultLatin2(org.keycloak.saml.processing.core.parsers.saml.SAMLParserTest)  Time elapsed: 0.008 s  <<< ERROR!
ParsingException [location=null]org.keycloak.saml.common.exceptions.ParsingException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[9,91]
Message: Invalid byte 2 of 3-byte UTF-8 sequence.
    at org.keycloak.saml.common.DefaultPicketLinkLogger.parserException(DefaultPicketLinkLogger.java:420)
    at org.keycloak.saml.common.util.StaxParserUtil.getElementText(StaxParserUtil.java:492)
    at org.keycloak.saml.processing.core.parsers.util.SAMLParserUtil.parseNameIDType(SAMLParserUtil.java:57)
    at org.keycloak.saml.processing.core.parsers.saml.assertion.SAMLSubjectParser.processSubElement(SAMLSubjectParser.java:58)
    at org.keycloak.saml.processing.core.parsers.saml.assertion.SAMLSubjectParser.processSubElement(SAMLSubjectParser.java:36)
    at org.keycloak.saml.common.parsers.AbstractStaxParser.parse(AbstractStaxParser.java:97)
    at org.keycloak.saml.processing.core.parsers.saml.assertion.SAMLAssertionParser.processSubElement(SAMLAssertionParser.java:69)
    at org.keycloak.saml.processing.core.parsers.saml.assertion.SAMLAssertionParser.processSubElement(SAMLAssertionParser.java:34)
    at org.keycloak.saml.common.parsers.AbstractStaxParser.parse(AbstractStaxParser.java:97)
    at org.keycloak.saml.processing.core.parsers.saml.protocol.SAMLResponseParser.processSubElement(SAMLResponseParser.java:77)
    at org.keycloak.saml.processing.core.parsers.saml.protocol.SAMLResponseParser.processSubElement(SAMLResponseParser.java:38)
    at org.keycloak.saml.common.parsers.AbstractStaxParser.parse(AbstractStaxParser.java:97)
    at org.keycloak.saml.processing.core.parsers.saml.SAMLParser.parse(SAMLParser.java:123)
    at org.keycloak.saml.common.parsers.AbstractParser.parse(AbstractParser.java:98)
    at org.keycloak.saml.common.parsers.AbstractParser.parse(AbstractParser.java:102)
    at org.keycloak.saml.processing.api.saml.v2.response.SAML2Response.getSAML2ObjectFromStream(SAML2Response.java:389)
    at org.keycloak.saml.processing.core.parsers.saml.SAMLParserTest.assertParsed(SAMLParserTest.java:141)
    at org.keycloak.saml.processing.core.parsers.saml.SAMLParserTest.testSaml20AuthnResponseNonAsciiNameDefaultLatin2(SAMLParserTest.java:262)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[9,91]
Message: Invalid byte 2 of 3-byte UTF-8 sequence.
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:652)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getElementText(XMLStreamReaderImpl.java:902)
    at java.xml/com.sun.xml.internal.stream.XMLEventReaderImpl.getElementText(XMLEventReaderImpl.java:187)
    at java.xml/javax.xml.stream.util.EventReaderDelegate.getElementText(EventReaderDelegate.java:110)
    at org.keycloak.saml.common.util.StaxParserUtil.getElementText(StaxParserUtil.java:490)
    ... 44 more

After this, I tried running the project directly from Intellij, but received the following error:在此之后,我尝试直接从 Intellij 运行该项目,但收到以下错误:

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/keycloak/adapters/tomcat/KeycloakAuthenticatorValve
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:139) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) ~[spring-context-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.keycloak.SpringBootAdapterApplication.main(SpringBootAdapterApplication.java:10) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/keycloak/adapters/tomcat/KeycloakAuthenticatorValve
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:201) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:136) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    ... 8 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/keycloak/adapters/tomcat/KeycloakAuthenticatorValve
    at org.keycloak.adapters.springboot.KeycloakAutoConfiguration$1.customize(KeycloakAutoConfiguration.java:59) ~[classes/:na]
    at org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:73) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:59) ~[spring-boot-1.5.20.RELEASE.jar:1.5.20.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1622) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.23.RELEASE.jar:4.3.23.RELEASE]
    ... 16 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_191]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_191]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_191]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_191]
    ... 22 common frames omitted


Process finished with exit code 1

I also tried skipping the tests with mvn install -DskipTests and the build succeeded, but I am not aware of the location of the newly created jar file containing the result of the build.我还尝试使用mvn install -DskipTests跳过测试并且构建成功,但我不知道包含构建结果的新创建的 jar 文件的位置。 Also, changing java version from 11 to 8 did not seem to affect the errors that would occur.此外,将 java 版本从 11 更改为 8 似乎不会影响可能发生的错误。 Switching to a fresh linux virtual machine did not really affect things, but tests would still fail for some unknown/unspecified reason, but in the test suites, not in the saml package.切换到新的 linux 虚拟机并没有真正影响事情,但是由于某些未知/未指定的原因,测试仍然会失败,但是在测试套件中,而不是在 saml 包中。

Please note that this is the version as-is from the repository, with no changes done by me.请注意,这是存储库中的原样版本,我没有做任何更改。

Probably maven profile is missing.可能缺少 Maven 配置文件。

Documentation: Building from source文档: 从源代码构建

  1. You need Java JDK8 and Maven installed and configured;您需要安装并配置 Java JDK8 和 Maven;
  2. In temrinal, change direcotry to project's root;在 temrinal 中,将目录改为项目的根目录;
  3. Run maven command:运行 maven 命令:

mvn -Pdistribution -pl distribution/server-dist -am -Dmaven.test.skip clean install

Resulting release distribution will be in ./distribution/server-dist/target/最终发布的发行版将在./distribution/server-dist/target/

The issue is in test and by skipping test will move you forward ( https://github.com/keycloak/keycloak/blob/master/docs/building.md ).问题正在测试中,跳过测试将使您前进( https://github.com/keycloak/keycloak/blob/master/docs/building.md )。 However there is clearly an issue with test file probably with encoding that need to be fixed.但是,测试文件显然存在问题,可能需要修复编码。

我找到了一个 maven 命令,可以为我可靠地解决这个问题:

mvn clean install -Pdistribution -DskipTests
  1. the entrance in testsuite folder keycloakserver class testsuite文件夹中keycloakserver类的入口
  2. and idea add a jboss(wildfly) server和idea添加一个jboss(wildfly)服务器
  3. config as jar debug配置为 jar 调试
  4. debug调试

url in chinese blog by me https://blog.csdn.net/xiaohelong2005/article/details/118932623我在中文博客中的 网址 https://blog.csdn.net/xiaohelong2005/article/details/118932623

I hope this will help you a lot note:mvn uses golang-mvn-wrapper which visit the google server ,if you behind gfw or other firewall block the google service,you need proxy the tool v2ray and proxifier need to be used.我希望这对你有很大帮助 注意:mvn 使用 golang-mvn-wrapper 访问谷歌服务器,如果你在 gfw 或其他防火墙后面阻止谷歌服务,你需要代理工具 v2ray 和需要使用 proxifier。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM